#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>
#define inf 1073741824
using namespace std;
struct node1
{
vector<long long> dui;
long long k;
long long x1,y1,x2,y2;
long long s1,s2,s3,s4;
}a[4000000];
struct node
{
long long x,y,r,id;
}p[1000000];
long long n,len=1;
long long f[1000000]={};
inline long long rd()
{
long long s=0,w=1;char x='x';
while(x<'0'||x>'9'){x=getchar();if(x=='-')w=-1;}
while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
return s*w;
}
inline bool cmp1(node x,node y)
{
return ((x.r==y.r)?(x.id<y.id):(x.r>y.r));
}
inline long long newnode(long long x1,long long y1,long long x2,long long y2)
{
len++;
a[len].x1=x1;
a[len].y1=y1;
a[len].x2=x2;
a[len].y2=y2;
return len;
}
inline bool outside(long long x1,long long y1,long long x2,long long y2,long long w)
{
if(x1>p[w].x)return true;
if(y1>p[w].y)return true;
if(x2<p[w].x)return true;
if(y2<p[w].y)return true;
return false;
}
long long add(long long u,long long x1,long long y1,long long x2,long long y2,long long w);
inline void xia_chuan(long long u,long long x1,long long y1,long long x2,long long y2,long long w)
{
a[u].s1=add(a[u].s1,x1,y1,(x1+x2)/2,(y1+y2)/2,w);
a[u].s2=add(a[u].s2,(x1+x2)/2+1,y1,x2,(y1+y2)/2,w);
a[u].s3=add(a[u].s3,x1,(y1+y2)/2+1,(x1+x2)/2,y2,w);
a[u].s4=add(a[u].s4,(x1+x2)/2+1,(y1+y2)/2+1,x2,y2,w);
}
long long add(long long u,long long x1,long long y1,long long x2,long long y2,long long w)
{
if(outside(x1,y1,x2,y2,w))return u;
if(u==0)
u=newnode(x1,y1,x2,y2);
a[u].k++;
if(a[u].k!=1&&a[u].x1!=a[u].x2)
{
xia_chuan(u,x1,y1,x2,y2,w);
return u;
}
a[u].dui.push_back(w);
return u;
}
inline void readd()
{
n=rd();
for(long long i=1;i<=n;i++)
{
p[i].x=rd();
p[i].y=rd();
p[i].r=rd();
p[i].id=i;
}
sort(p+1,p+1+n,cmp1);
}
inline long long dis(long long x,long long y){return x*x+y*y;}
inline bool jiao(long long u,long long w)
{
if(dis(a[u].x1-p[w].x,a[u].y1-p[u].y)<=p[w].r*p[w].r)return true;
if(dis(a[u].x2-p[w].x,a[u].y1-p[u].y)<=p[w].r*p[w].r)return true;
if(dis(a[u].x1-p[w].x,a[u].y2-p[u].y)<=p[w].r*p[w].r)return true;
if(dis(a[u].x2-p[w].x,a[u].y2-p[u].y)<=p[w].r*p[w].r)return true;
if(p[w].x>=a[u].x1&&p[w].x<=a[u].x2)
{
if(p[w].y>a[u].y2)
{
if(p[w].y-p[w].r<=a[u].y2)
return true;
}
else if(p[w].y<a[u].y1)
{
if(p[w].y+p[w].r>=a[u].y1)
return true;
}
else
return true;
}
if(p[w].y>=a[u].y1&&p[w].y<=a[u].y2)
{
if(p[w].x>a[u].x2)
{
if(p[w].x-p[w].r<=a[u].x2)
return true;
}
else if(p[w].x<a[u].x1)
{
if(p[w].x+p[w].r>=a[u].x1)
return true;
}
else
return true;
}
return false;
}
void del(long long u,long long w)
{
if(u==0)return;
if(!jiao(u,w))return;
for(long long i=0,v;i<a[u].dui.size();i++)
{
v=a[u].dui[i];
if(f[p[v].id]==0&&dis(p[v].x-p[w].x,p[v].y-p[w].y)<=(p[v].r+p[w].r)*(p[v].r+p[w].r))
f[p[v].id]=p[w].id;
}
del(a[u].s1,w);del(a[u].s2,w);del(a[u].s3,w);del(a[u].s4,w);
}
inline void working()
{
a[1].x1=a[1].y1=-inf;
a[1].x2=a[1].y2=inf;
for(long long i=1;i<=n;i++)
add(1,-inf,-inf,inf,inf,i);
for(long long i=1;i<=n;i++)
if(f[p[i].id]==0)
f[p[i].id]=p[i].id,del(1,i);
for(long long i=1;i<=n;i++)
printf("%lld ",f[i]);
}
int main()
{
readd();
working();
return 0;
}