#include <bits/stdc++.h>
using namespace std;
int n, f[20010];
struct pnt {
  int x, y, nr;
  bool t;
  bool operator<(const pnt &A) const { return x == A.x ? y < A.y : x < A.x; }
  void in(int i) {
    scanf("%d%d", &x, &y);
    nr = (i - 1) % n + 1;
    t = (i > n);
  }
} P[20010], T;
bool cmp(pnt A, pnt B) {
  return (A.x - T.x) * (B.y - T.y) < (B.x - T.x) * (A.y - T.y);
}
void link(int i, int j) {
  if (P[i].t)
    f[P[j].nr] = P[i].nr;
  else
    f[P[i].nr] = P[j].nr;
}
vector<int> v;
int cm;
bool ccmp(int i, int j) { return abs(cm - i) < abs(cm - j); }
void solve(int l, int r) {
  if (l > r) return;
  if (l + 1 == r) {
    link(l, r);
    return;
  }
  int id = min_element(P + l, P + r + 1) - P;
  T = P[id];
  swap(P[id], P[l]);
  sort(P + l + 1, P + r + 1, cmp);
  int delta = 0, mid;
  for (mid = l + 1; mid <= r; mid++) {
    if (P[mid].t != P[l].t && delta == 0) v.push_back(mid);
    delta += P[mid].t ? 1 : -1;
  }
  cm = l + r + 1 >> 1;
  mid = *min_element(v.begin(), v.end(), ccmp);
  v.clear();
  link(l, mid);
  solve(l + 1, mid - 1);
  solve(mid + 1, r);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= 2 * n; i++) P[i].in(i);
  solve(1, 2 * n);
  for (int i = 1; i <= n; i++) printf("%d\n", f[i]);
}
