0 都WA了 能过样例 求调
查看原帖
0 都WA了 能过样例 求调
327605
Moon0909楼主2024/10/21 21:23
#include<iostream>
using namespace std;
long long n,q,m;
long long num[100005]; 
struct node{
	long long l;
	long long r;
	long long pre;
	long long add;
	long long mul;
}t[400005];
long long build(long long x,long long ll,long long rr){ 
	t[x].l=ll;t[x].r=rr;
	t[x].mul=1;
	if(ll==rr){
		t[x].pre=num[ll]%m;
		return t[x].pre;
	}
	long long mid=(t[x].l+t[x].r)/2;
	t[x].pre+=build(x*2,ll,mid)%m;
	t[x].pre+=build(x*2+1,mid+1,rr)%m;
	return t[x].pre;
}
void aa(long long x){
	t[x*2].add+=t[x].add;
	t[x*2+1].add+=t[x].add;
	t[x*2].pre+=(t[x*2].r-t[x*2].l+1)*t[x].add;
	t[x*2].pre%=m;
	t[x*2+1].pre+=(t[x*2+1].r-t[x*2+1].l+1)*t[x].add;
	t[x*2+1].pre%=m;
	t[x].pre=t[x*2].pre+t[x*2+1].pre;
	t[x].pre%=m;
	t[x].add=0;
}
void cc(long long x){
	t[x*2].mul*=t[x].mul;
	t[x*2+1].mul*=t[x].mul;
	t[x*2].pre*=t[x*2].mul;
	t[x*2].pre%=m;
	t[x*2+1].pre*=t[x*2+1].mul;
	t[x*2+1].pre%=m;
	t[x].pre=t[x*2].pre+t[x*2+1].pre;
	t[x].pre%=m;
	t[x].mul=1;
}
void cheng(long long x,long long ll,long long rr,long long kk){
	if(t[x].l>=ll&&t[x].r<=rr){
		t[x].mul*=kk;
		t[x].pre*=kk;
		t[x].pre%=m;
		return;
	}
	long long mid=(t[x].l+t[x].r)/2;
	cc(x); 
	if(ll<=mid){
		cheng(x*2,ll,rr,kk);
	}
	if(rr>mid){
		cheng(x*2+1,ll,rr,kk);
	}
	t[x].pre=t[x*2].pre+t[x*2+1].pre;
	t[x].pre%=m;
}
void jia(long long x,long long ll,long long rr,long long kk){
	if(t[x].l>=ll&&t[x].r<=rr){
		t[x].add+=kk;
		t[x].pre+=kk*(t[x].r-t[x].l+1);
		t[x].pre%=m;
		return;
	}
	long long mid=(t[x].l+t[x].r)/2;
	aa(x);
	if(ll<=mid){
		
		jia(x*2,ll,rr,kk);
	}
	if(rr>mid){
		jia(x*2+1,ll,rr,kk);
	}
	t[x].pre=t[x*2].pre+t[x*2+1].pre;
	t[x].pre%=m;
}

long long ques(long long x,long long ll,long long rr){
	if(t[x].l>=ll&&t[x].r<=rr){
		return t[x].pre;
	}
	if(t[x].add!=0){
		aa(x);
	}
	if(t[x].mul!=1){
		cc(x);
	}
	long long mid=(t[x].l+t[x].r)/2;
	long long maxx=0;
	if(ll<=mid){
		maxx+=ques(x*2,ll,rr);
		maxx%=m;
	}
	if(rr>mid){
		maxx+=ques(x*2+1,ll,rr);
		maxx%=m;
	}
	return maxx;
}
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++){
		cin>>num[i];
		num[i]%=m;
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int ls;
		cin>>ls;
		if(ls==1){
			long long x,y,k;
			cin>>x>>y>>k;
			cheng(1,x,y,k); 
		}
		else if(ls==2){
			long long x,y,k;
			cin>>x>>y>>k;
			jia(1,x,y,k);  
		}
		else if(ls==3){
			long long x,y;
			cin>>x>>y;
			cout<<ques(1,x,y)%m<<endl; 
		}
	}
	return 0;
}
2024/10/21 21:23
加载中...