#pragma GCC optimize("O3,Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 303030;
struct Circle {
int x, y, r, id;
bool doesIntersect(const Circle& rhs) const {
ll dx = x - rhs.x;
ll dy = y - rhs.y;
ll pr = r + rhs.r;
return dx * dx + dy * dy <= pr * pr;
}
};
int div_floor(int a, int b) {
int q = a / b;
int r = a % b;
if (r != 0 && ((r > 0) != (b > 0))) q--;
return q;
}
int n, a[MAXN];
Circle cx[MAXN];
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> cx[i].x >> cx[i].y >> cx[i].r; cx[i].id = i;
}
auto rescale = [&](int R) -> map<pair<int, int>, vector<Circle>> {
map<pair<int, int>, vector<Circle>> res;
for(int i = 1; i <= n; i++) {
if(a[i]) continue;
int r = cx[i].x / R;
int c = cx[i].y / R;
res[{r, c}].push_back(cx[i]);
}
return res;
};
int R = 1e9;
vector<int> v(n);
iota(v.begin(), v.end(), 1);
sort(v.begin(), v.end(), [](int i, int j) { return tuple(-cx[i].r, i) < tuple(-cx[j].r, j); });
auto table = rescale(R);
for(auto i : v) {
if(a[i]) continue;
a[i] = i;
int oldR = R;
while(R/2 >= cx[i].r) R /= 2;
if(oldR != R) table = rescale(R);
int r = div_floor(cx[i].x, R);
int c = div_floor(cx[i].y, R);
for(int dr = -2; dr <= 2; dr++) {
for(int dc = -2; dc <= 2; dc++) {
for(auto c : table[{r+dr, c+dc}]) {
if(!a[c.id] && cx[i].doesIntersect(c)) a[c.id] = i;
}
}
}
}
for(int i = 1; i <= n; i++) cout << a[i] << " ";
}