struct MurasameCute{
int l,r,ls,rs,sum;
}tr[30000000];
#define l(x) tr[x].l
#define r(x) tr[x].r
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define sm(x) tr[x].sum
#define mid ((l(id)+r(id))>>1)
#define up sm(id)=sm(ls(id))+sm(rs(id))
void crt(int &id,int l,int r,int sum=0){
id=++cnt;
l(id)=l,r(id)=r,sm(id)=sum;
}
void copy(int &to,int fr){
to=++cnt;
tr[to]=tr[fr];
}
void build(int &id,int l,int r){
crt(id,l,r,0);
if(l==r) return;
build(ls(id),l,mid);
build(rs(id),mid+1,r);
}
void insert(int id,int x,int y){
if(l(id)==r(id)){
sm(id)+=y;
return;
}
if(x<=mid){
copy(ls(id),ls(id));
insert(ls(id),x,y);
}
else{
copy(rs(id),rs(id));
insert(rs(id),x,y);
}
up;
}
int kth(int idl,int idr,int k){
if(l(idl)==r(idl)){
return l(idl);
}
int x=sm(ls(idr))-sm(ls(idl));
if(x>=k){
return kth(ls(idl),ls(idr),k);
}
else{
return kth(rs(idl),rs(idr),k-x);
}
}