求调0pts,玄2关 码风简洁
查看原帖
求调0pts,玄2关 码风简洁
1111300
ayszYW楼主2024/7/13 21:22

机房里人说我写的好

#include<bits/stdc++.h>
using namespace std;
#define tl (c<<1)
#define ty (c<<1|1)
#define int long long

int n,m,q,arr[110000];
struct Cy{
	int l;
	int r;
	int len; 
	int sum;
	int mu;
	int tag;
}tr[110000<<2]; 

void build(int a,int b,int c){
	tr[c].l=a,tr[c].r=b,tr[c].mu=1;
	tr[c].len=b-a+1;
	if(a==b){
		tr[c].sum=arr[a];
		return;
	}
	int mid=(a+b)>>1;
	build(a,mid,tl);
	build(mid+1,b,ty);
	
	tr[c].sum=(tr[tl].sum+tr[ty].sum)%m;
	
	
} 

int x,y,k;

void add(int c){
	if(x<=tr[c].l&&tr[c].r<=y){
		tr[c].sum+=k*tr[c].len%m;
		tr[c].tag+=k%m;
		return;
	}
	if(y<tr[c].l||tr[c].r<x){
		return;
	}
	add(tl);
	add(ty);
	tr[c].sum=tr[tl].sum%m+tr[ty].sum%m;
	return;
}

void cf(int c){
	if(x<=tr[c].l&&tr[c].r<=y){
		tr[c].sum*=k%m;
		tr[c].tag*=k%m;
		tr[c].mu*=k%m;
		return;
	}
	if(y<tr[c].l||tr[c].r<x){
		return;
	}
	cf(tl);
	cf(ty);
	tr[c].sum=(tr[tl].sum+tr[ty].sum)%m;
	return;
}


void pushdown(int c){
	
	tr[tl].sum*=tr[c].mu%m;
	tr[ty].sum*=tr[c].mu%m;
	
	tr[tl].sum+=tr[c].tag*tr[tl].len%m;
	tr[ty].sum+=tr[c].tag*tr[ty].len%m;
	
	tr[tl].tag=tr[tl].tag*tr[c].mu+tr[c].tag%m;
	tr[ty].tag=tr[ty].tag*tr[c].mu+tr[c].tag%m;
	
	tr[tl].mu*=tr[c].mu%m;
	tr[ty].mu*=tr[c].mu%m;
	
	
	tr[c].tag=0;
	tr[c].mu=1;
	return;
}


int query(int c){
	if(x<=tr[c].l&&tr[c].r<=y){
		return tr[c].sum%m;
	}
	if(y<tr[c].l||tr[c].r<x){
		return 0;
	}
	pushdown(c);
	int ret=0;
	ret+=query(tl)%m;
	ret+=query(ty)%m;
	return ret%m;
	
}


signed main(){
	cin>>n>>q>>m;
	int op;
	for(int i=1;i<=n;i++)cin>>arr[i],arr[i]%=m;
	
	build(1,n,1);
	
	for(int i=1;i<=q;i++){
	//	for(int i=1;i<=4*n;i++)cout<<tr[i].sum<<" ";
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			cf(1);
		}
		
		else if(op==2){
			cin>>k;
			add(1);
		}
		
		else if(op==3){
			int ans=query(1);
			cout<<ans%m<<endl;
		}
		
	}
	
}
2024/7/13 21:22
加载中...