求助fhq-treap做CF438D
查看原帖
求助fhq-treap做CF438D
311478
__gcd__楼主2023/8/7 16:45
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int ls,rs,pri,sum,tag,size,val,key;
}t[100005];
int root,cnt;
void upt(int u){
	t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
	t[u].sum=t[t[u].ls].sum+t[t[u].rs].sum+t[u].val;
}
int newnode(int x,int k){
	cnt++;
	t[cnt].pri=rand();
	t[cnt].sum=t[cnt].val=x;
	t[cnt].ls=t[cnt].rs=0;
	t[cnt].size=1;
	t[cnt].key=k;
	return cnt;
}
void pushdown(int u){
	if(t[u].tag){
		t[u].val%=t[u].tag;
		t[t[u].ls].tag=t[t[u].rs].tag=t[u].tag;
	}
	t[u].tag=0;
	upt(u);
}
void split(int u,int x,int &l,int &r){
	if(u==0){
		l=r=0;
		return ;
	}
	pushdown(u);
	if(t[u].key<=x){
		l=u;
		split(t[u].rs,x,t[u].rs,r);
	}
	else{
		r=u;
		split(t[u].ls,x,l,t[u].ls); 
	}
	upt(u);
	return ;
}
int merge(int l,int r){
	if(l==0||r==0)
	  return l+r;
	if(t[l].pri>t[r].pri){
		pushdown(l);
		t[l].rs=merge(t[l].rs,r);
		upt(l);
		return l;
	}
	else{
		pushdown(r);
		t[r].ls=merge(l,t[r].ls);
		upt(r);
		return r;
	}
}
void insert(int x,int k){
	int l,r;
	split(root,k,l,r);
	root=merge(merge(l,newnode(x,k)),r);
}
signed main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		insert(x,i);
	}
	for(int i=1;i<=n;i++){
		int opt,x,y,z;
		cin>>opt>>x>>y;
		if(opt==1){
			int l,r,p;
			split(root,x-1,l,r);
			split(r,y,r,p);
			plusupt(r);
			printf("%d\n",t[r].sum);
			root=merge(l,merge(r,p));
		}
		if(opt==2){
			cin>>z;
			int l,r,p;
			split(root,x-1,l,r);
			split(r,y,r,p);
			t[r].tag=z;
			root=merge(l,merge(r,p));
		}
		if(opt==3){
			int l,r,p;
			split(root,x-1,l,r);
			split(r,x,r,p);
			t[r].val=y;
			root=merge(l,merge(r,p));
		}
	}
	return 0;
}
2023/8/7 16:45
加载中...