求调
查看原帖
求调
730894
Cockroach_hzs楼主2023/10/19 17:05
#include<bits/stdc++.h>
#define lp p<<1
#define rp p<<1|1 
using namespace std;
const int N=1e5+10;
long long n,a[N],m,l,r,q,x,s,y,k,cnt=0;
struct tree{
	int l,r,sum,mul,add;
}tr[4*N];
void up(int p){
	tr[p].sum=(tr[lp].sum+tr[rp].sum)%m;
}
void down(int p){
	if(tr[p].add){
		tr[lp].sum=((tr[lp].r-tr[lp].l+1)*tr[p].add%m+tr[lp].sum*tr[p].mul)%m;
		tr[rp].sum=((tr[rp].r-tr[rp].l+1)*tr[p].add%m+tr[rp].sum*tr[p].mul)%m;
		
		tr[lp].mul=tr[lp].mul*tr[p].mul%m;
		tr[rp].mul=tr[rp].mul*tr[p].mul%m;
		
		tr[rp].add=(tr[rp].add*tr[p].mul+tr[p].add)%m;
		tr[lp].add=(tr[lp].add*tr[p].mul+tr[p].add)%m;
		
		tr[p].mul=1;
		tr[p].add=0;
	}
}
void build(int l,int r,int p){
	tr[p]={l,r,0,1,0};
	if(l==r){
		tr[p].sum=a[p];
		return;
	}
	int m=l+r>>1;
	build(l,m,lp);
	build(m+1,r,rp);
	up(p);
}
void cheng(int l,int r,int k,int p){
	if(tr[p].l<l||tr[p].r>r){
		return ;
	}
	if(tr[p].l>=l&&tr[p].r<=r){
		tr[p].mul*=k;
		tr[p].add*=k;
		tr[p].sum*=k;
		return;
	}
	int m=(tr[p].l+tr[p].r)>>1;
	down(p);
	if(x<=m){
		cheng(l,r,k,lp);
	} 
	if(y>m){
		cheng(l,r,k,rp);
	}
	up(p);
}
void jia(int l,int r,int k,int p){
	if(tr[p].l<l||tr[p].r>r){
		return ;
	}
	if(tr[p].l>=l&&tr[p].r<=r){
		tr[p].sum+=(tr[p].r-tr[p].l+1)*k;
		tr[p].add+=k;
		return;
	}
	int m=(tr[p].l+tr[p].r)>>1;
	down(p);
	if(x<=m){
		jia(l,r,k,lp);
	} 
	if(y>m){
		jia(l,r,k,rp);
	}
	up(p);
}
int shu(int x,int y,int p){
	if(l<=tr[p].l&&r>=tr[p].r){
		return tr[p].sum;
	}
	int m=tr[p].l+tr[p].r>>1;
	int cnt=0;
	if(x<=m){
		cnt+=shu(x,y,lp);
	}
	if(y>m){
		cnt+=shu(x,y,rp);
	}
	return cnt;
}
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	for(int i=1;i<=q;i++){
		cin>>s;
		if(s==1){
			cin>>x>>y>>k;
			cheng(x,y,k,1);
		}
		if(s==2){
			cin>>x>>y>>k;
			jia(x,y,k,1);	
		}
		if(s==3){
			cin>>x>>y;
			shu(x,y,1);
			cout<<cnt%m;
		}
		}
		
	return 0;
}
2023/10/19 17:05
加载中...