#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]);
  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]);
}
