int tree[20][maxn],toleft[20][maxn],sorted[maxn];
void Build( int l , int r , int dep )
{
if ( l==r ) return;
int mid = (l+r)>>1;
int lpos = l;
int rpos = mid+1;
for ( int i=l ; i<=r ; i++ )
{
if ( tree[dep][i]<=sorted[mid]&&lpos<=mid )
tree[dep+1][lpos++] = tree[dep][i];
else
tree[dep+1][rpos++] = tree[dep][i];
toleft[dep][i] = toleft[dep][l-1]+lpos-l;
}
Build( l , mid , dep+1 );
Build( mid+1 , r , dep+1 );
}
int Query( int L , int R , int l , int r , int dep , int k )
{
if( L==R ) return tree[dep][L];
int mid = (l+r)>>1;
int cnt = toleft[dep][R]-toleft[dep][L-1];
if ( cnt>=k )
{
int newl = l+toleft[dep][L-1]-toleft[dep][l-1];
int newr = newl+cnt-1;
return Query( newl , newr , l , mid , dep+1 , k );
}
else
{
int newr = R+toleft[dep][r]-toleft[dep][R];
int newl = newr-(R-L-cnt);
return Query( newl , newr , mid+1 , r , dep+1 , k-cnt );
}
}