#include <bits/stdc++.h>
using namespace std;
const int maxn = 20000;
struct Point {
  int x, y, id, type;
  double angle;
  void input() { scanf("%d%d", &x, &y); }
  bool operator<(const Point &a) const {
    if (y != a.y) return y < a.y;
    return x < a.x;
  }
  void cal(const Point &a) { angle = atan2(y - a.y, x - a.x); }
} a[maxn + 5];
bool cmp(const Point &a, const Point &b) { return a.angle < b.angle; }
int n;
int ans[maxn + 5];
void solve(int l, int r) {
  if (l > r) return;
  int pos = l;
  for (int i = l + 1; i <= r; ++i)
    if (a[i] < a[pos]) pos = i;
  swap(a[pos], a[l]);
  for (int i = l + 1; i <= r; ++i) a[i].cal(a[l]);
  sort(a + l + 1, a + r + 1, cmp);
  int now = a[l].type;
  for (int i = l + 1; i <= r; ++i) {
    now += a[i].type;
    if (now == 0) {
      ans[a[i].id] = a[l].id;
      ans[a[l].id] = a[i].id;
      solve(l + 1, i - 1);
      solve(i + 1, r);
      return;
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= 2 * n; ++i) {
    a[i].input();
    a[i].id = i;
    if (i <= n)
      a[i].type = -1;
    else
      a[i].type = 1;
  }
  solve(1, 2 * n);
  for (int i = 1; i <= n; ++i) printf("%d\n", ans[i] - n);
  return 0;
}
