#include <bits/stdc++.h>
using namespace std;
struct xy {
  int x, y, t, w;
};
int ccw(xy a, xy b, xy c) {
  return a.x * b.y + b.x * c.y + c.x * a.y - a.y * b.x - b.y * c.x - c.y * a.x;
}
xy p;
int dist(xy a, xy b) {
  return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
bool sort_angle(xy a, xy b) {
  int v = ccw(p, a, b);
  if (v == 0) return dist(p, a) < dist(p, b);
  return ccw(p, a, b) < 0;
}
int S[121212], ans[121212];
xy A[121212];
void go(int s, int e) {
  if (s > e) return;
  p.y = 1e9;
  for (int i = s; i <= e; i++) {
    xy v = A[i];
    if (p.y > v.y || (p.y == v.y && p.x > v.x)) p = v;
  }
  sort(A + s, A + e + 1, sort_angle);
  S[s] = 0;
  for (int i = s; i <= e; i++) {
    S[i + 1] = S[i] + A[i].t;
  }
  int m = (e - s + 1) / 2, w = -1;
  for (int i = s + m, j = s + m;; i--, j++) {
    if (i > s && S[i + 1] == 0) {
      if (A[s].t != A[i].t) {
        w = i;
        break;
      }
    }
    if (j <= e && S[j + 1] == 0) {
      if (A[s].t != A[j].t) {
        w = j;
        break;
      }
    }
  }
  if (A[s].t == 1)
    ans[A[s].w] = A[w].w;
  else
    ans[A[w].w] = A[s].w;
  go(s + 1, w - 1);
  go(w + 1, e);
}
int main() {
  int n;
  scanf("%d", &n);
  int i, j;
  vector<xy> L;
  for (i = 0; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    A[i] = {x, y, 1, i};
  }
  for (i = n; i < 2 * n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    A[i] = {x, y, -1, i - n};
  }
  go(0, 2 * n - 1);
  for (i = 0; i < n; i++) printf("%d\n", ans[i] + 1);
  return 0;
}
