struct PT{
static constexpr int N=2e5+5;
//值域
int up;
vector<int>b;
map<int,int>mp;
int cntNodes,root[N];
struct node{
int l,r;
int cnt;
}tr[4*N+17*N];
void modify(int &u,int v,int l,int r,int x){
u=++cntNodes;
tr[u]=tr[v];
tr[u].cnt++;
if(l==r)return;
int mid=l+r>>1;
if(x<=mid)modify(tr[u].l,tr[v].l,l,mid,x);
else modify(tr[u].r,tr[v].r,mid+1,r,x);
}
int kth(int u,int v,int l,int r,int k){
if(l==r)return l;
int res=tr[tr[v].l].cnt-tr[tr[u].l].cnt;
int mid=l+r>>1;
if(k<=res)return kth(tr[u].l,tr[v].l,l,mid,k);
else {
return kth(tr[u].r,tr[v].r,mid+1,r,k-res);
}
}
void init(vector<int>&a){
//传入a(n+1)
for(int i=1;i<a.size();i++)b.pb(a[i]);
sort(b.begin(),b.end());
b.erase(unique(b.begin(),b.end()),b.end());
up=b.size();
for(int i=1;i<a.size();i++){
mp[a[i]]=1+lower_bound(b.begin(),b.end(),a[i])-b.begin();
}
for(int i=1;i<a.size();i++){
modify(root[i],root[i-1],1,up,mp[a[i]]);
}
}
int query(int l,int r,int k){
//返回[l,r]区间第k小
return (b[kth(root[l-1],root[r],1,up,k)-1]);
}
}tree;