const int maxn = 100010;
const int maxm = maxn*30;
int n,q,m,tot;
int a[maxn],b[maxn];
int T[maxn],lson[maxm],rson[maxm],c[maxm];
int Build( int l , int r )
{
int root = tot++;
c[root] = 0;
if ( l!=r )
{
int mid = (l+r)>>1;
lson[root] = Build( l , mid );
rson[root] = Build( mid+1 , r );
}
return root;
}
int Update( int root , int pos , int val )
{
int newroot = tot++,tmp = newroot;
c[newroot] = c[root]+val;
int l = 1,r = m;
while ( l<r )
{
int mid = (l+r)>>1;
if( pos<=mid )
{
lson[newroot] = tot++; rson[newroot] = rson[root];
newroot = lson[newroot]; root = lson[root]; r = mid;
}
else
{
rson[newroot] = tot++; lson[newroot] = lson[root];
newroot = rson[newroot]; root = rson[root]; l = mid+1;
}
c[newroot] = c[root]+val;
}
return tmp;
}
int Query( int left_root , int right_root , int k )
{
int l=1,r=m;
while ( l<r )
{
int mid = (l+r)>>1;
if ( c[lson[left_root]]-c[lson[right_root]]>=k )
{
r = mid;
left_root = lson[left_root];
right_root = lson[right_root];
}
else
{
l = mid+1;
k -= c[lson[left_root]]-c[lson[right_root]];
left_root = rson[left_root];
right_root = rson[right_root];
}
}
return l;
}