#include <bits/stdc++.h>
using namespace std;
int n, dap[11111];
struct abc {
  int x, y, t, idx;
} a[22222], O;
bool compare1(const abc &i, const abc &j) {
  return i.x < j.x || i.x == j.x && i.y < j.y;
}
bool compare2(const abc &i, const abc &j) {
  return (i.y - O.y) * (j.x - O.x) < (j.y - O.y) * (i.x - O.x);
}
void go(int lft, int rgt) {
  if (lft >= rgt) return;
  int mn_idx = min_element(a + lft, a + rgt + 1, compare1) - a;
  swap(a[lft], a[mn_idx]);
  O = a[lft];
  sort(a + lft + 1, a + rgt + 1, compare2);
  int mid = rgt + 1, s[2] = {};
  s[a[lft].t]++;
  while (1) {
    s[a[--mid].t]++;
    if (s[0] == s[1] && a[lft].t != a[mid].t) break;
  }
  if (a[lft].t)
    dap[a[mid].idx] = a[lft].idx;
  else
    dap[a[lft].idx] = a[mid].idx;
  go(lft + 1, mid - 1);
  go(mid + 1, rgt);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= 2 * n; i++) {
    scanf("%d %d", &a[i].x, &a[i].y);
    a[i].t = (i > n);
    a[i].idx = i;
  }
  go(1, 2 * n);
  for (int i = 1; i <= n; i++) {
    printf("%d\n", dap[i] - n);
  }
  return 0;
}
