10分fhq-treap求助
查看原帖
10分fhq-treap求助
285617
黑影洞人楼主2022/11/5 15:14
#include<cstdio>
#include<algorithm>
#define pii pair<int,int>
#define N 1919810
#define int long long
using namespace std;
int seed;
void _srand(int x){seed=x;}
int _rand(){seed=seed*97%19260817;return seed;}
struct FHQ_Treap{
	pii val[N]; 
	int ch[N][2],siz[N],rnd[N],cnt,root;
	#define lc ch[x][0]
	#define rc ch[x][1]
	int update(int x){siz[x]=siz[lc]+siz[rc]+1;return x;}
	void split(int p,pii v,int &x,int &y){
		if(!p)return void(x=y=0);
		if(val[p]<=v)split(ch[x=p][1],v,ch[p][1],y);
		else split(ch[y=p][0],v,x,ch[p][0]);
		update(p);
	}
	int merge(int x,int y){
		if(!x||!y)return x+y;
		if(rnd[x]<rnd[y]){rc=merge(rc,y);return update(x);}
		else{ch[y][0]=merge(x,ch[y][0]);return update(y);}
	}
	int rnk(int x,int k){
		while(1){
			if(k==siz[lc]+1)return x;
			if(k<=siz[lc])x=lc;
			else k-=siz[lc]+1,x=rc;
		}
	}
	pii kth(int rt,int k){return val[rnk(rt,k)];}
	int newnode(pii v){siz[++cnt]=1,val[cnt]=v,rnd[cnt]=_rand();return cnt;}
	void insert(pii v){
		int x,y;
		split(root,v,x,y);
		root=merge(merge(x,newnode(v)),y);
	}
	void del(pii v){
		int x,y,z;
		split(root,v,y,z);
		split(y,{v.first,v.second-1},y,x);
		root=merge(merge(y,merge(lc,rc)),z);
	}
	bool find(pii v){
		int x,y;
		split(root,make_pair(v.first,v.second-1),x,y);
		pii v1=kth(y,1);
		if(v.first==v1.first)return 1;
		else return 0;
	}
}t;
int n,m,a[N],ans;
signed main(){
	_srand(676767);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		t.insert({i,a[i]});
		ans+=a[i];
	}
	while(m--){
		char s[10];
		int x,y;
		scanf("%s",s);
		if(s[0]=='Q')printf("%lld\n",ans);
		else if(s[0]=='C'){
			scanf("%lld%lld",&x,&y);
			t.del({x,a[x]});
			t.insert({x,a[x]-y});
			a[x]-=y;
			ans-=y;
		}else if(s[0]=='I'){
			scanf("%lld%lld",&x,&y);
			if(t.find({x,-1e9})){
				t.del({x,a[x]});
				ans-=a[x],ans+=y,a[x]=y;
				t.insert({x,a[x]});
			}else ans+=y,a[x]=y,t.insert({x,a[x]});
		}else if(s[0]=='D'){
			scanf("%lld",&x);
			pii ax=t.kth(t.root,x);
			ans-=ax.second;a[ax.first]=0;
			t.del(ax);
		}
	}
	return 0;
}



2022/11/5 15:14
加载中...