#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] && points[k].idx < result[idx])) {
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+PSBuKSBjb250aW51ZTsKICAgICAgICAgICAgaW50IGQgPSBtYW5oYXR0YW4ocG9pbnRzW2ldLCBwb2ludHNba10pOwogICAgICAgICAgICBpZiAoZCA8IGRpc3RbaWR4XSB8fCAoZCA9PSBkaXN0W2lkeF0gJiYgcG9pbnRzW2tdLmlkeCA8IHJlc3VsdFtpZHhdKSkgewogICAgICAgICAgICAgICAgZGlzdFtpZHhdID0gZDsKICAgICAgICAgICAgICAgIHJlc3VsdFtpZHhdID0gcG9pbnRzW2tdLmlkeDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbjsKICAgIGNpbiA+PiBuOwogICAgdmVjdG9yPFBvaW50PiBwb2ludHMobik7CiAgICB2ZWN0b3I8aW50PiByZXN1bHQobiwgLTEpOwogICAgdmVjdG9yPGludD4gZGlzdChuLCBJTlRfTUFYKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGNpbiA+PiBwb2ludHNbaV0ueCA+PiBwb2ludHNbaV0ueTsKICAgICAgICBwb2ludHNbaV0uaWR4ID0gaTsKICAgIH0KCiAgICBjaGVjayhyZXN1bHQsIGRpc3QsIHBvaW50cywgWFkpOwogICAgY2hlY2socmVzdWx0LCBkaXN0LCBwb2ludHMsIFhfWSk7CiAgICBjaGVjayhyZXN1bHQsIGRpc3QsIHBvaW50cywgX1hZKTsKICAgIGNoZWNrKHJlc3VsdCwgZGlzdCwgcG9pbnRzLCBfWF9ZKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGNvdXQgPDwgKHJlc3VsdFtpXSArIDEpIDw8ICIgIjsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9