#include <bits/stdc++.h>
using namespace std;
inline int getint() {
  int num = 0, flag = 1;
  char c;
  while ((c = getchar()) < '0' || c > '9')
    if (c == '-') flag = -1;
  while (c >= '0' && c <= '9') num = num * 10 + c - 48, c = getchar();
  return num * flag;
}
int n;
struct node {
  int x, y, id, t;
} p[600005], t;
int ans[600005];
inline bool cmp1(node x, node y) { return x.x == y.x ? x.y < y.y : x.x < y.x; }
inline bool cmp2(node x, node y) {
  return 1ll * (x.y - t.y) * (y.x - t.x) < 1ll * (y.y - t.y) * (x.x - t.x);
}
inline void solve(int l, int r) {
  if (l > r) return;
  int id = min_element(p + l, p + r + 1, cmp1) - p;
  swap(p[id], p[l]), t = p[l];
  sort(p + l + 1, p + r + 1, cmp2);
  int sum = 0;
  for (int i = l + 1; i <= r; i++) {
    if (!sum && p[i].t != t.t) {
      id = i;
      break;
    }
    if (p[i].t == t.t)
      sum++;
    else
      sum--;
  }
  if (t.t)
    ans[p[id].id] = t.id;
  else
    ans[t.id] = p[id].id;
  solve(l + 1, id - 1), solve(id + 1, r);
}
int main() {
  n = getint();
  for (int i = 1; i <= 2 * n; i++)
    p[i].x = getint(), p[i].y = getint(), p[i].id = (i - 1) % n + 1,
    p[i].t = (i - 1) / n;
  solve(1, 2 * n);
  for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
}
