# CodeForces - 958E3 Guard Duty (hard)

### Description

$n\le 10^4$

### Solution

#include<bits/stdc++.h>
using namespace std;

template <class T> void read(T &x) {
x = 0; bool flag = 0; char ch = getchar(); for (; ch < '0' || ch > '9'; ch = getchar()) flag |= ch == '-';
for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - 48; flag ? x = ~x + 1 : 0;
}

//#pragma GCC diagnostic error "-std=c++14"

#define N 20010
#define rep(i, a, b) for (auto i = (a); i <= (b); ++i)
#define drp(i, a, b) for (auto i = (a); i >= (b); --i)

struct Point {
int x, y, id;
bool type;
}a[N], t;

int ans[N];

bool cmp1(const Point& a, const Point& b) {
return a.x < b.x || a.x == b.x && a.y < b.y;
}

bool cmp2(const Point& a, const Point& b) {
return 1.0 * (a.y - t.y) / (a.x - t.x) < 1.0 * (b.y - t.y) / (b.x - t.x);
}

void solve(int l, int r) {
if (l > r) return;
int c = min_element(a + l, a + r + 1, cmp1) - a;
swap(a[c], a[l]), t = a[l];
sort(a + l + 1, a + r + 1, cmp2);
int k = r, sum1 = 0, sum2 = 0;
for (; t.type == a[k].type || sum1 != sum2; k--)
if (a[k].type == t.type) sum1++; else sum2++;
a[k].type ? ans[t.id] = a[k].id : ans[a[k].id] = t.id;
solve(l + 1, k - 1), solve(k + 1, r);
}

int main() {
}