struct cyc{
int x,y,id;
bool operator < (const cyc &b)const{
return id<b.id;
}
bool check_in(const pair<int,int> &q)const{
return 1LL*(x-q.first)*(x-q.first)+1LL*(y-q.second)*(y-q.second)<1LL*y*y;
}
};
const int MAXN=2e5+5,MAXM=MAXN*30,MAXV=1e9;
int rt,ls[MAXM],rs[MAXM],node_cnt;
set<cyc> s[MAXM];
cyc cycs[MAXN];
void update(int &k,int nl,int nr,int ql,int qr,cyc c,bool del){
if(!k)k=++node_cnt;
if(ql<=nl&&nr<=qr){
if(del)
s[k].erase(c);
else
s[k].insert(c);
return;
}
int nm=nl+nr>>1;
if(nm>=ql)
update(ls[k],nl,nm,ql,qr,c,del);
if(nm<qr)
update(rs[k],nm+1,nr,ql,qr,c,del);
}
int query(int k,int nl,int nr,int pos,pair<int,int> q){
if(!k)return -1;
for(set<cyc>::iterator it=s[k].begin();it!=s[k].end();it++){
if(it->check_in(q))
return it->id;
}
if(nl==nr)return -1;
int nm=nl+nr>>1;
if(nm>=pos)
return query(ls[k],nl,nm,pos,q);
else
return query(rs[k],nm+1,nr,pos,q);
}
int main()
{
int n=read_int();
_rep(i,1,n){
int t=read_int(),x=read_int(),y=read_int();
if(t==1){
cycs[i]=cyc{x,y,i};
update(rt,-MAXV,MAXV,max(-MAXV,x-y),min(MAXV,x+y),cycs[i],false);
}
else{
int ans=query(rt,-MAXV,MAXV,x,make_pair(x,y));
enter(ans);
if(ans!=-1)
update(rt,-MAXV,MAXV,max(-MAXV,cycs[ans].x-cycs[ans].y),min(MAXV,cycs[ans].x+cycs[ans].y),cycs[ans],true);
}
}
return 0;
}