70 #2#9#10过不了
查看原帖
70 #2#9#10过不了
254491
橙橙like海绵楼主2022/1/1 08:32
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
ll sum[N],n,m,a[N],p,add[N],mul[N];
ll read(){
	ll s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return w*s;
}
void build(int k,int l,int r){
	if(l==r){sum[k]=a[l];return ;} 
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	mul[k]=1;
	sum[k]=sum[k*2]+sum[k*2+1];
}
void Add(int k,int l,int r,int v){
	add[k]=(add[k]+v)%p;
	sum[k]+=((r-l+1)*v)%p;
}
void Mul(int k,int v){
	mul[k]=(v*mul[k]%p);
	sum[k]=(v*sum[k]%p);
	add[k]=(v*add[k]%p);
}
void push_down(int k,int l,int r,int mid){
	//if((!add[k])&&(mul[k]==1)) return;
	Mul(k*2,mul[k]);
	Mul(k*2+1,mul[k]);
	mul[k]=1;
	Add(k*2,l,mid,add[k]);
	Add(k*2+1,mid+1,r,add[k]);
	add[k]=0;
}
void change_add(int k,int l,int r,int x,int y,int v){
//	if (r < x || y < l) return;
	if(x<=l&&r<=y){Add(k,l,r,v);return ;}
	int mid=(l+r)/2; 
	push_down(k,l,r,mid);
	if(x<=mid) 
	change_add(k*2,l,mid,x,y,v);
	if(mid<y) 
	change_add(k*2+1,mid+1,r,x,y,v);
	sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
void change_mul(int k,int l,int r,int x,int y,int v){
//	if (r < x || y < l) return;
	if(x<=l&&r<=y){Mul(k,v);return ;}
	int mid=(l+r)/2; 
	push_down(k,l,r,mid);
	if(x<=mid) 
	change_mul(k*2,l,mid,x,y,v);
	if(mid<y) 
	change_mul(k*2+1,mid+1,r,x,y,v);
	sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
int query(int k,int l,int r,int x,int y){
	//if (r < x || y < l) return 0;
	if(x<=l&&r<=y) return sum[k]%p;
	int mid=(l+r)/2;
	ll res=0;
	push_down(k,l,r,mid);
	if(x<=mid) 
	res=(res%p+query(k*2,l,mid,x,y)%p)%p;
	if(mid<y) 
	res=(res%p+query(k*2+1,mid+1,r,x,y)%p)%p;
	return res%p;
}
int main(){
	n=read();m=read();p=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	ll opt,l,r,k;
	for(int i=1;i<=m;i++){
		opt=read();l=read();r=read();
		if(opt==3) printf("%d\n",query(1,1,n,l,r)%p);
		else{
			k=read();
			if(opt==1){
				change_mul(1,1,n,l,r,k);
			}
			else{
				change_add(1,1,n,l,r,k);
			}
		}
	}
	return 0;
}
/*
5 4 38
1 5 4 2 3
2 1 4 1
3 2 5
2 3 5 5
3 1 4
*/
2022/1/1 08:32
加载中...