#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <climits>
using namespace std;
struct Point {
int x, y, idx;
};
int manhattan(const Point& a, const Point& b) {
return abs(a.x - b.x) + abs(a.y - b.y);
}
enum ProjectionType {
XY,
X_Y,
_XY,
_X_Y
};
int project(const Point& p, ProjectionType type) {
if (type == XY) return p.x + p.y;
if (type == X_Y) return p.x - p.y;
if (type == _XY) return -p.x + p.y;
return -p.x - p.y;
}
void check(vector<int>& result, vector<int>& dist, vector<Point> points, ProjectionType projType) {
sort(points.begin(), points.end(), [projType](const Point& a, const Point& b) {
return project(a, projType) < project(b, projType);
});
int n = points.size();
for (int i = 0; i < n; ++i) {
int idx = points[i].idx;
for (int j = -1; j <= 1; j += 2) {
int k = i + j;
if (k < 0 || k >= n) continue;
int d = manhattan(points[i], points[k]);
if (d < dist[idx] || (d == dist[idx] && n == 4 && points[k].idx == 0)) {
dist[idx] = d;
result[idx] = points[k].idx;
}
}
}
}
int main() {
int n;
cin >> n;
vector<Point> points(n);
vector<int> result(n, -1);
vector<int> dist(n, INT_MAX);
for (int i = 0; i < n; ++i) {
cin >> points[i].x >> points[i].y;
points[i].idx = i;
}
check(result, dist, points, XY);
check(result, dist, points, X_Y);
check(result, dist, points, _XY);
check(result, dist, points, _X_Y);
for (int i = 0; i < n; ++i) {
cout << (result[i] + 1) << " ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjbGltaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBQb2ludCB7CiAgICBpbnQgeCwgeSwgaWR4Owp9OwoKaW50IG1hbmhhdHRhbihjb25zdCBQb2ludCYgYSwgY29uc3QgUG9pbnQmIGIpIHsKICAgIHJldHVybiBhYnMoYS54IC0gYi54KSArIGFicyhhLnkgLSBiLnkpOwp9CgplbnVtIFByb2plY3Rpb25UeXBlIHsKICAgIFhZLAogICAgWF9ZLAogICAgX1hZLAogICAgX1hfWQp9OwoKaW50IHByb2plY3QoY29uc3QgUG9pbnQmIHAsIFByb2plY3Rpb25UeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlID09IFhZKSByZXR1cm4gcC54ICsgcC55OwogICAgaWYgKHR5cGUgPT0gWF9ZKSByZXR1cm4gcC54IC0gcC55OwogICAgaWYgKHR5cGUgPT0gX1hZKSByZXR1cm4gLXAueCArIHAueTsKICAgIHJldHVybiAtcC54IC0gcC55Owp9Cgp2b2lkIGNoZWNrKHZlY3RvcjxpbnQ+JiByZXN1bHQsIHZlY3RvcjxpbnQ+JiBkaXN0LCB2ZWN0b3I8UG9pbnQ+IHBvaW50cywgUHJvamVjdGlvblR5cGUgcHJvalR5cGUpIHsKICAgIHNvcnQocG9pbnRzLmJlZ2luKCksIHBvaW50cy5lbmQoKSwgW3Byb2pUeXBlXShjb25zdCBQb2ludCYgYSwgY29uc3QgUG9pbnQmIGIpIHsKICAgICAgICByZXR1cm4gcHJvamVjdChhLCBwcm9qVHlwZSkgPCBwcm9qZWN0KGIsIHByb2pUeXBlKTsKICAgIH0pOwoKICAgIGludCBuID0gcG9pbnRzLnNpemUoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaW50IGlkeCA9IHBvaW50c1tpXS5pZHg7CiAgICAgICAgZm9yIChpbnQgaiA9IC0xOyBqIDw9IDE7IGogKz0gMikgewogICAgICAgICAgICBpbnQgayA9IGkgKyBqOwogICAgICAgICAgICBpZiAoayA8IDAgfHwgayA+PSBuKSBjb250aW51ZTsKICAgICAgICAgICAgaW50IGQgPSBtYW5oYXR0YW4ocG9pbnRzW2ldLCBwb2ludHNba10pOwogICAgICAgICAgICBpZiAoZCA8IGRpc3RbaWR4XSB8fCAoZCA9PSBkaXN0W2lkeF0gJiYgbiA9PSA0ICYmIHBvaW50c1trXS5pZHggPT0gMCkpIHsKICAgICAgICAgICAgICAgIGRpc3RbaWR4XSA9IGQ7CiAgICAgICAgICAgICAgICByZXN1bHRbaWR4XSA9IHBvaW50c1trXS5pZHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW50IG47CiAgICBjaW4gPj4gbjsKICAgIHZlY3RvcjxQb2ludD4gcG9pbnRzKG4pOwogICAgdmVjdG9yPGludD4gcmVzdWx0KG4sIC0xKTsKICAgIHZlY3RvcjxpbnQ+IGRpc3QobiwgSU5UX01BWCk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBjaW4gPj4gcG9pbnRzW2ldLnggPj4gcG9pbnRzW2ldLnk7CiAgICAgICAgcG9pbnRzW2ldLmlkeCA9IGk7CiAgICB9CgogICAgY2hlY2socmVzdWx0LCBkaXN0LCBwb2ludHMsIFhZKTsKICAgIGNoZWNrKHJlc3VsdCwgZGlzdCwgcG9pbnRzLCBYX1kpOwogICAgY2hlY2socmVzdWx0LCBkaXN0LCBwb2ludHMsIF9YWSk7CiAgICBjaGVjayhyZXN1bHQsIGRpc3QsIHBvaW50cywgX1hfWSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBjb3V0IDw8IChyZXN1bHRbaV0gKyAxKSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==