#include <bits/stdc++.h>   #pragma GCC optimize( Ofast )   using namespace std;   struct Point {     int x, y, type, index;   } num[20005];   int ans[10005];   Point c;   bool cmp(Point a, Point b) {     return (a.x - c.x) * (b.y - c.y) - (a.y - c.y) * (b.x - c.x) > 0;   }   bool cmp2(Point a, Point b) { return (a.x < b.x) || (a.x == b.x && a.y < b.y); }   void f(int l, int r) {     if (l >= r) return;     int i;     swap(num[l], num[min_element(num + l, num + r + 1, cmp2) - num]);     for (i = l + 1; i <= r; i++) {       num[i].x -= num[l].x;       num[i].y -= num[l].y;     }     num[l].x = num[l].y = 0;     c = num[l];     sort(num + l + 1, num + r + 1, cmp);     int pre = num[l].type, minv = 1000000000, id = -1;     for (i = l + 1; i <= r; i++) {       pre += num[i].type;       if (!pre && num[i].type != num[l].type && max(i - l - 1, r - i) < minv) {         minv = max(i - l - 1, r - i);         id = i;       }     }     if (num[l].type == 1)       ans[num[id].index] = num[l].index;     else       ans[num[l].index] = num[id].index;     f(l + 1, id - 1);     f(id + 1, r);   }   int main() {     int i, n;     scanf( %d , &n);     for (i = 0; i < n; i++) {       scanf( %d%d , &num[i].x, &num[i].y);       num[i].type = -1;       num[i].index = i + 1;     }     for (i = 0; i < n; i++) {       scanf( %d%d , &num[n + i].x, &num[n + i].y);       num[n + i].type = 1;       num[n + i].index = i + 1;     }     f(0, 2 * n - 1);     for (i = 1; i <= n; i++) printf( %d n , ans[i]);   }   