#include <bits/stdc++.h>
using namespace std;
const int MAXN = 20233;
int n, ans[MAXN];
struct point {
  int x, y, id;
  bool opt;
  point() {}
  point(int xx, int yy) {
    x = xx, y = yy;
    id = 0, opt = 0;
  }
} p[MAXN], base;
point operator-(const point &aa, const point &bb) {
  return point(aa.x - bb.x, aa.y - bb.y);
}
long long operator*(const point &aa, const point &bb) {
  return 1ll * aa.x * bb.y - 1ll * aa.y * bb.x;
}
bool operator<(const point &aa, const point &bb) {
  return (aa - base) * (bb - base) > 0;
}
void solve(int l, int r) {
  if (l > r) return;
  int t = l;
  for (int i = l + 1; i <= r; i++)
    if (p[i].y < p[t].y || (p[i].y == p[t].y && p[i].x < p[t].x)) t = i;
  swap(p[t], p[l]);
  base = p[l];
  sort(p + l + 1, p + r + 1);
  int pos, sum = 0;
  for (pos = r; p[pos].opt == base.opt || sum; pos--)
    sum += p[pos].opt == base.opt ? 1 : -1;
  if (base.opt)
    ans[p[pos].id] = base.id;
  else
    ans[base.id] = p[pos].id;
  solve(l + 1, pos - 1), solve(pos + 1, r);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%d%d", &p[i].x, &p[i].y), p[i].id = i, p[i].opt = 0;
  for (int i = 1; i <= n; i++)
    scanf("%d%d", &p[i + n].x, &p[i + n].y), p[i + n].id = i, p[i + n].opt = 1;
  solve(1, n << 1);
  for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
  return 0;
}
