刚开始学treapA的第一个题,虽然是模板题,但是还是查了好久的错。而且这个题,用cin和cout输入输出会T
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
using namespace std;
const int maxn=100000+100;
const int maxm=50000+500;
struct Query{
int L,R,k,id;
bool operator <(const Query &rhs)const{
return L<rhs.L;
}
}q[maxm];
int n,m;
int a[maxn];
int ans[maxm];
struct Node {
Node* ch[2];
int v,r,s;
int cmp(int x)const{
if(x==v)return -1;
return x<v?0:1;
}
void maintain(){
s=1;
if(ch[0]!=NULL)
s+=ch[0]->s;
if(ch[1]!=NULL)
s+=ch[1]->s;
}
Node(int v):v(v){
r=rand();s=1;
ch[0]=NULL;ch[1]=NULL;
}
};
void rorate(Node* &o,int d){//d=0左旋1右旋
Node *k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o;
o->maintain();k->maintain();o=k;
}
void insert(Node* &o,int x){
if(o==NULL){
o=new Node(x);
}else{
int d=(x<o->v?0:1);
insert(o->ch[d],x);
if(o->r < o->ch[d]->r)
rorate(o,d^1);
}
o->maintain();
}
void remove(Node* &o,int x){
int d=o->cmp(x);
if(d==-1){
Node *u=o;
if(o->ch[0]!=NULL&&o->ch[1]!=NULL){
int d2=(o->ch[0]->r<o->ch[1]->r?0:1);
rorate(o,d2);remove(o->ch[d2],x);
}else{
if(o->ch[0]==NULL)o=o->ch[1];else o=o->ch[0];
delete u;
}
}else
{
remove(o->ch[d],x);
}
if(o!=NULL)o->maintain();
}
int kth(Node *o,int k){
if(o==NULL||k<=0||k>o->s)return 0;
int s=(o->ch[1]==NULL)?0:o->ch[1]->s;
if(k==s+1)return o->v;
else if(k<=s)return kth(o->ch[1],k);
else return kth(o->ch[0],k-s-1);
}
Node* root=NULL;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&q[i].L,&q[i].R,&q[i].k);
q[i].id=i;
}
sort(q+1,q+1+m);
int L=1,R=1;
for(int i=1;i<=m;i++){
while(L<q[i].L){
if(L<R)remove(root,a[L]);
L++;
}
if(R<L) R=L;
while(R<=q[i].R){
insert(root,a[R]);
R++;
}
ans[q[i].id]=kth(root,R-L-q[i].k+1);
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}