#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,fma")
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];
unordered_map<long long,vector<int>>mp;
int n,cursz=2e9+1,ans[300002];
bool alive[300002];
long long idx(int x,int y){
return (x+1000000000ll)*2000000000ll+y+1000000000ll;
}
void build(){
mp.clear();
for(int i = 1; i <= n; i++){
if(!alive[i])continue;
mp[idx(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[idx(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((long long)dx*dx+(long long)dy*dy<=(long long)sr*sr&&alive[idx]){
alive[idx]=0;
ans[inp[idx].idx]=inp[i].idx;
}
}
}
}
}
for(int i = 1; i <= n; i++){
cout<<ans[i]<<' ';
}
}