FHQ-Treap求条
查看原帖
FHQ-Treap求条
639198
Steve_xh楼主2024/9/29 17:47
#include<bits/stdc++.h>
using namespace std;
const int MAXN=80005;
int cnt=0,rt=0,n,m,id[80005];
mt19937 rnd;
struct Treap{
	int l,r,x,p,sz,f;
}t[80005];
inline void newnode(int x){
	t[++cnt].x=x;
	t[cnt].p=rnd();
	t[cnt].f=t[cnt].l=t[cnt].r=0;
	t[cnt].sz=1;
}
inline void pushup(int x){
	t[x].sz=1;
	if(t[x].l)
		t[x].sz+=t[t[x].l].sz,t[t[x].l].f=x;
	if(t[x].r)
		t[x].sz+=t[t[x].r].sz,t[t[x].r].f=x;
}
void split(int x,int w,int &l,int &r){
	if(!x)
		return (void)(l=r=0);
	if(t[t[x].l].sz+1<=w)
		l=x,split(t[x].r,w,t[x].r,r);
	else
		r=x,split(t[x].l,w,l,t[x].l);
	pushup(x);
}
int merge(int l,int r){
	if(!l||!r)
		return l|r;
	if(t[l].p>t[r].p){
		t[l].r=merge(t[l].r,r);
		pushup(l);
		return l;
	}else{
		t[r].l=merge(l,t[r].l);
		pushup(r);
		return r;
	}
}
void insert(int x){
	int l,r;
	split(rt,cnt,l,r);
	newnode(x);
	rt=merge(merge(l,cnt),r);
	id[x]=cnt;
}
int findk(int x){
	int reans=1+t[t[x].l].sz;
	while(x&&t[x].f){
		if(x==t[t[x].f].r)
			reans+=t[t[t[x].f].r].sz+1;
		x=t[x].f;
	}
	return reans;
}
string op;
int main(){
	cin.tie(nullptr)->sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1,t;i<=n;i++)
		cin>>t,insert(t);
	for(int i=1,s,tmp,rk,lm,rm,l,r;i<=m;i++){
		cin>>op>>s;
		rk=findk(id[s]);
		switch(op[0]){
			case 'T':
				split(rt,rk,l,r);
				split(l,rk-1,l,lm);
				rt=merge(merge(lm,l),r);
				break;
			case 'B':
				split(rt,rk,l,r);
				split(l,rk-1,l,lm);
				rt=merge(merge(l,r),lm);
				break;
			case 'I':
				cin>>tmp;
				if(tmp<0){
					split(rt,rk,l,r);
					split(l,rk-1,l,rm);
					split(l,rk-2,l,lm);
					rt=merge(merge(merge(l,rm),lm),r);
				}if(tmp>0){
					split(rt,rk,l,r);
					split(l,rk-1,l,lm);
					split(r,1,rm,r);
					rt=merge(merge(merge(l,rm),lm),r);
				}break;
			case 'A':
				cout<<rk-1<<'\n';
				break;
			case 'Q':
				split(rt,rk,l,r);
				split(l,rk-1,l,lm);
				cout<<t[lm].x<<'\n';
				rt=merge(merge(l,lm),r);
		}
	}
	return 0;
}
2024/9/29 17:47
加载中...