FHQ-treap 蒟蒻全WA求助!!!
查看原帖
FHQ-treap 蒟蒻全WA求助!!!
856459
yangjunhan1楼主2023/9/1 22:49
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int h[N],sum[N],tot,sz[N],v[N],ls[N],rs[N],n,m,root,hm[N];
bool lazy[N];
void szup(int x){
	sz[x]=sz[ls[x]]+sz[rs[x]]+1;
}
int hb(int l,int r){
	if(!l || !r)	return l+r;
	if(h[l]<h[r]){
		rs[l]=hb(rs[l],r);
		szup(l);
		return l;
	}
	else{
		ls[r]=hb(l,ls[r]);
		szup(r);
		return r;
	}
}
void jd(int x){
	tot++;
	v[tot]=x;
	h[tot]=rand();
	sz[tot]=1;
	hm[x]=tot;
	szup(tot);
	root=hb(root,tot);
}
void fl(int rt,int &l,int &r,int x){
	if(!rt){
		l=r=0;
		return ;
	}
	int s=sz[ls[rt]]+1;
	if(s<=x){
		l=rt;
		fl(rs[rt],rs[l],r,x-s);
		szup(l);	
	} 
	else{
		r=rt;
		fl(ls[rt],l,ls[r],x);
		szup(r);
	}
}
void ffl(int rt,int &l,int &r,int x){
	if(!rt){
		l=r=0;
		return ;
	}
	if(v[rt]<=x){
		l=rt;
		fl(rs[rt],rs[l],r,x);
		szup(l);
	}
	else{
		r=rt;
		fl(ls[rt],l,ls[r],x);
		szup(r);
	}
}
int gpm(int x){
	int l,r;
	ffl(root,l,r,x-1);
	int ans=sz[l]+1;
	hb(l,r);
	return ans;
}
void sm(int x){
	x=gpm(hm[x]);
    int l,r,me;
	fl(root,l,r,x);
	fl(l,l,me,x-1);
	root=hb(hb(r,l),me);
}
void xm(int x){
	x=gpm(hm[x]);
    int l,r,me;
    fl(root,l,r,x);
    fl(l,l,me,x-1);
    root=hb(hb(l,me),r);
}
void inst(int x,int t){
	x=gpm(hm[x]);
	int l,r,a,b;
	fl(root,l,r,x-1);
	fl(r,r,a,1);
	if(t<0){
		fl(l,l,b,x-2);
		root=hb(hb(hb(l,r),b),a);
	}else{
		fl(a,a,b,1);
		root=hb(hb(hb(l,a),r),b);
	}
}
int gs(int x){
	int l,r,me;
	x=gpm(hm[x]);
	fl(root,l,r,x-1);
	fl(r,me,r,x);
	int ans=me;
	root=hb(l,hb(r,me));
	return ans;
}
int pm(int x){
	int l,r,me;
	ffl(root,l,r,x-1);
	fl(r,me,r,1);
	int ans=me;
	root=hb(l,hb(r,me));
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
        int k;
        cin>>k;
    	jd(k);
    }
	while(m--){
		string op;
		int s,t;
		cin>>op>>s;
		if(op[0]=='T')	sm(s);
		if(op[0]=='B')	xm(s);
		if(op[0]=='I'){
			cin>>t;
			inst(s,t);
		}
		if(op[0]=='A')	cout<<pm(s)<<endl;
		if(op[0]=='Q')	cout<<gs(s)<<endl;
	}
	return 0;
}
2023/9/1 22:49
加载中...