全RE,求助
查看原帖
全RE,求助
250607
toroso楼主2022/7/31 18:09
#include<stdio.h>
#include<cstring>
using namespace std;
inline long long read(){
	long long k=0,j=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')j=-1;c=getchar();}
	while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
	return k*j;
}
long long p,a[100005],sum[400005],mul[400005],add[400005];
void Mul(long long k,long long l,long long r,long long v){
	add[k]=(add[k]*v)%p;mul[k]=(mul[k]*v)%p;sum[k]=(sum[k]*v)%p;
}
void Add(long long k,long long l,long long r,long long v){
	add[k]=(add[k]+v)%p;sum[k]=(sum[k]+v*(r-l+1))%p;
}
long long pushdown(long long k,long long l,long long r,long long mid){
	if(mul[k]!=1){
		Mul(k*2,l,mid,mul[k]);
		Mul(k*2+1,mid+1,r,mul[k]);
		mul[k]=1;
	}
	if(add[k]!=0){
		Add(k*2,l,mid,add[k]);
		Add(k*2+1,mid+1,r,add[k]);
		add[k]=0;
	}
}
void modify_add(long long k,long long l,long long r,long long x,long long y,long long v){
	if(x<=l&&r<=y){Add(k,l,r,v);return;}
	long long mid=(l+r)/2;
	pushdown(k,l,r,mid);
	if(mid>=x)modify_add(k*2,l,mid,x,y,v);
	if(mid<y)modify_add(k*2+1,mid+1,r,x,y,v);
	sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
void modify_mul(long long k,long long l,long long r,long long x,long long y,long long v){
	if(x<=l&&r<=y){Mul(k,l,r,v);return;}
	long long mid=(l+r)/2;
	pushdown(k,l,r,mid);
	if(mid>=x)modify_mul(k*2,l,mid,x,y,v);
	if(mid<y)modify_mul(k*2+1,mid+1,r,x,y,v);
	sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
long long query(long long k,long long l,long long r,long long x,long long y){
	if(x<=l&&r<=y)return sum[k];
	long long res=0,mid=(l+r)/2;
	pushdown(k,l,r,mid);
	if(mid>=x)res+=query(k*2,l,mid,x,y);
	if(mid<y)res+=query(k*2+1,mid+1,r,x,y);
	return res;
}
void build(long long k,long long l,long long r){
	if(l==r){sum[k]=a[l];return ;}
	long long mid=(l+r)/2;
	build(k*2,l,mid);build(k*2+1,mid+1,r);
	sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
int main(){
	long long n=read(),m=read();p=read();
	for(long long i=1;i<=n;i++)a[i]=read();
	for(long long i=1;i<=n*4;i++)mul[i]=1;
	build(1,1,n);
	while(m--){
		long long x=read();
		if(x==1){
			long long s=read(),t=read(),v=read();
			modify_mul(1,1,n,s,t,v);
		}
		if(x==2){
			long long s=read(),t=read(),v=read();
			modify_add(1,1,n,s,t,v);
		}
		if(x==3){
			long long s=read(),t=read();
			printf("%lld\n",query(1,1,n,s,t)%p);
		}
	}
	return 0;
}

2022/7/31 18:09
加载中...