#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const long long ooo = 9223372036854775807ll;
const int _cnt = 1000 * 1000 + 7;
const int _p = 1000 * 1000 * 1000 + 7;
const int N = 100005;
const double PI = acos(-1.0);
const double eps = 1e-9;
int o(int x) { return x % _p; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
void file_put() {
  freopen("filename.in", "r", stdin);
  freopen("filename.out", "w", stdout);
}
struct Point {
  int x, y, op, id;
} a[N], tmp;
inline bool cmp1(const Point &a, const Point &b) {
  return a.x < b.x || a.x == b.x && a.y < b.y;
}
inline bool cmp2(const Point &a, const Point &b) {
  return (a.x - tmp.x) * (b.y - tmp.y) - (a.y - tmp.y) * (b.x - tmp.x) > 0;
}
int n, ans[N], c0, c1;
void solve(int l, int r) {
  if (l > r) return;
  int p = min_element(a + l, a + r + 1, cmp1) - a;
  swap(a[l], a[p]), tmp = a[l], sort(a + l + 1, a + r + 1, cmp2);
  int k = l + 1;
  c0 = c1 = 0;
  while (c0 != c1 || tmp.op == a[k].op) {
    c0 += (a[k].op == tmp.op), c1 += (a[k].op != tmp.op);
    ++k;
  }
  ans[((a[k].id) < (tmp.id) ? (a[k].id) : (tmp.id))] =
      ((a[k].id) > (tmp.id) ? (a[k].id) : (tmp.id)) - n;
  solve(l + 1, k - 1), solve(k + 1, r);
}
int main() {
  scanf("%d", &n);
  for (int i = (1); i <= (2 * n); ++i)
    scanf("%d%d", &a[i].x, &a[i].y), a[i].op = (i > n), a[i].id = i;
  solve(1, 2 * n);
  for (int i = (1); i <= (n); ++i) printf("%d\n", ans[i]);
  return 0;
}
