#include #include #include #include using namespace std; template void read(T &x) { T ans=0;short f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { ans=(ans<<1)+(ans<<3)+(ch^48); ch=getchar(); }x=ans*f; } #define maxn 200005 struct { int l,r; vectors; }tree[maxn<<2]; int n,m; int a[maxn],p[maxn],t; int l,r,k; vectorS[maxn]; void build(int x,int l,int r) { int mid=(l+r)>>1; tree[x].l=l,tree[x].r=r; if(l==r) { tree[x].s=S[mid]; return; } build(x<<1,l,mid); build(x<<1|1,mid+1,r); if(x==1)return; vector::iterator it1=tree[x<<1].s.begin(); vector::iterator it2=tree[x<<1|1].s.begin(); while(it1!=tree[x<<1].s.end()&&it2!=tree[x<<1|1].s.end()) if(*it1<*it2)tree[x].s.push_back(*it1),it1++; else tree[x].s.push_back(*it2),it2++; while(it1!=tree[x<<1].s.end())tree[x].s.push_back(*it1),it1++; while(it2!=tree[x<<1|1].s.end())tree[x].s.push_back(*it2),it2++; } int ask(int x,int k) { if(tree[x].l==tree[x].r)return *tree[x].s.begin(); int val=upper_bound(tree[x<<1].s.begin(),tree[x<<1].s.end(),r)-upper_bound(tree[x<<1].s.begin(),tree[x<<1].s.end(),l-1); if(val>=k)return ask(x<<1,k); if(val