蒟蒻求助,FHQ过了样例,但0分
查看原帖
蒟蒻求助,FHQ过了样例,但0分
657565
babatuosi楼主2023/5/22 20:41
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct trnode{int d,ran,siz,lc,rc;}tr[300100];
int trlen,ans,rt,T1,T2,T3;
void pushup(int x){tr[x].siz=tr[tr[x].lc].siz+tr[tr[x].rc].siz+1;}
void split(int now,int k,int &x,int &y){
	if(!now){x=y=0;return ;}
	if(tr[now].d<=k){
		x=now;split(tr[x].rc,k,tr[x].rc,y);
	}
	else{
		y=now;split(tr[y].lc,k,x,tr[y].lc);
	}
	pushup(now);
}
int merge(int x,int y){
	if(!x||!y) return x+y;
	if(tr[x].ran<tr[y].ran){
		tr[x].rc=merge(tr[x].rc,y);
		pushup(x);return x;
	}
	else{
		tr[y].lc=merge(x,tr[y].lc);
		pushup(y);return y;
	}
}
int add(int d){
	int now=++trlen;
	tr[now]={d,0,1};tr[now].ran=rand();
	return now;
}
void ins(int d){
	split(rt,d,T1,T2);
	rt=merge(T1,merge(add(d),T2));
}
int findkth(int x,int k){
	if(k<=tr[tr[x].lc].siz) return findkth(tr[x].lc,k);
	if(k==tr[tr[x].lc].siz+1) return x;
	return findkth(tr[x].rc,k-tr[tr[x].lc].siz-1);
}
int work(int l,int r,int c){
	split(rt,r,T1,T2);
	split(T1,l-1,T1,T3);
	int p=findkth(T3,c);
	rt=merge(merge(T1,T3),T2);
	return tr[p].d;
}
signed main(){
	//freopen("P1533_1.in","r",stdin);
	//freopen("cout.out","w",stdout);
	int n,m;scanf("%lld%lld",&n,&m);
	for(int i=1,c;i<=n;i++) scanf("%lld",&c),ins(c);
	while(m--){
		int x,y,c;scanf("%lld%lld%lld",&x,&y,&c);
		printf("%lld\n",work(x,y,c));
	}
}
2023/5/22 20:41
加载中...