#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,fma")
#define int long long
using namespace std;
using pii = pair<int,int>;
struct circle{
int x,y,r,idx;
bool operator<(const circle &c)const{
if(r==c.r){
if(idx!=c.idx)return idx<c.idx;
if(x!=c.x)return x<c.x;
return y<c.y;
}
return r>c.r;
}
}inp[300002];
map<pii,vector<int>>mp;
int n,cursz=1e18,ans[300002];
bool alive[300002];
void build(){
mp.clear();
for(int i = 1; i <= n; i++){
if(!alive[i])continue;
mp[{inp[i].x/cursz,inp[i].y/cursz}].push_back(i);
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i = 1; i <= n; i++){
cin>>inp[i].x>>inp[i].y>>inp[i].r;
inp[i].idx=i;
alive[i]=1;
}
sort(inp+1,inp+n+1);
for(int i = 1; i <= n; i++){
if(cursz>inp[i].r*2){
cursz=inp[i].r;
build();
}
if(!alive[i])continue;
int x=inp[i].x/cursz,y=inp[i].y/cursz;
for(int j = x-2; j <= x+2; j++){
for(int k = y-2; k <= y+2; k++){
for(auto idx :mp[{j,k}]){
int dx=inp[i].x-inp[idx].x,dy=inp[i].y-inp[idx].y,sr=inp[i].r+inp[idx].r;
if(dx*dx+dy*dy<=sr*sr){
alive[idx]=0;
ans[inp[idx].idx]=inp[i].idx;
}
}
vector<int>tmp;
for(auto idx :mp[{j,k}]){
if(alive[idx])tmp.push_back(idx);
}
swap(mp[{j,k}],tmp);
}
}
}
for(int i = 1; i <= n; i++){
cout<<ans[i]<<' ';
}
}