30分求条
查看原帖
30分求条
416975
sbno333楼主2023/11/23 14:29
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,m;
int aa[10000009];
struct st{
	int l,r;
	int x;
	int b1,b2;
}f[10000009];
void inite(int l,int r,int t){
	f[t].x=aa[r]-aa[l-1];
	f[t].l=l;
	f[t].r=r;
	f[t].b1=1;
	f[t].x%=m;
	f[t].b2%=m;
	f[t].b1%=m;
	f[2*t].x%=m;
	f[2*t].b2%=m;
	f[2*t].b1%=m;
	f[2*t+1].x%=m;
	f[2*t+1].b2%=m;
	f[2*t+1].b1%=m;
	if(l==r){
		return;
	}
	int mid;
	mid=l+r;
	mid/=2;
	inite(l,mid,2*t);
	inite(mid+1,r,2*t+1);
}
void qc(int t,int l,int r,int x){
	if(l==f[t].l&&r==f[t].r){
		f[t].b1*=x;
		f[t].b2*=x;
		f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
		f[2*t].b1*=f[t].b1;
		f[2*t].b2*=f[t].b1;
		f[2*t].b2+=f[t].b2;
		f[2*t+1].b1*=f[t].b1;
		f[2*t+1].b2*=f[t].b1;
		f[2*t+1].b2+=f[t].b2;
		f[t].b1=1;
		f[t].b2=0;
		f[t].x%=m;
		f[t].b2%=m;
		f[t].b1%=m;
		f[2*t].x%=m;
		f[2*t].b2%=m;
		f[2*t].b1%=m;
		f[2*t+1].x%=m;
		f[2*t+1].b2%=m;
		f[2*t+1].b1%=m;
		return;
	}	
	f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
	f[2*t].b1*=f[t].b1;
	f[2*t].b2*=f[t].b1;
	f[2*t].b2+=f[t].b2;
	f[2*t+1].b1*=f[t].b1;
	f[2*t+1].b2*=f[t].b1;
	f[2*t+1].b2+=f[t].b2;
	f[t].b1=1;
	f[t].b2=0;
	f[t].x%=m;
	f[t].b2%=m;
	f[t].b1%=m;
	f[2*t].x%=m;
	f[2*t].b2%=m;
	f[2*t].b1%=m;
	f[2*t+1].x%=m;
	f[2*t+1].b2%=m;
	f[2*t+1].b1%=m;
	int mid;
	mid=f[t].l+f[t].r;
	mid/=2;
	if(r<=mid){
		qc(2*t,l,r,x);
	}else if(l>mid){
		qc(2*t+1,l,r,x);
	}else{
		qc(2*t,l,mid,x);
		qc(2*t+1,mid+1,r,x);
	}
	f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(r-l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(r-l+1));
}
void qj(int t,int l,int r,int x){
	if(l==f[t].l&&r==f[t].r){
		f[t].b2+=x;
		f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
		f[2*t].b1*=f[t].b1;
		f[2*t].b2*=f[t].b1;
		f[2*t].b2+=f[t].b2;
		f[2*t+1].b1*=f[t].b1;
		f[2*t+1].b2*=f[t].b1;
		f[2*t+1].b2+=f[t].b2;
		f[t].b1=1;
		f[t].b2=0;
		f[t].x%=m;
		f[t].b2%=m;
		f[t].b1%=m;
		f[2*t].x%=m;
		f[2*t].b2%=m;
		f[2*t].b1%=m;
		f[2*t+1].x%=m;
		f[2*t+1].b2%=m;
		f[2*t+1].b1%=m;
		return;
	}	
	f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
	f[2*t].b1*=f[t].b1;
	f[2*t].b2*=f[t].b1;
	f[2*t].b2+=f[t].b2;
	f[2*t+1].b1*=f[t].b1;
	f[2*t+1].b2*=f[t].b1;
	f[2*t+1].b2+=f[t].b2;
	f[t].b1=1;
	f[t].b2=0;
	f[t].x%=m;
	f[t].b2%=m;
	f[t].b1%=m;
	f[2*t].x%=m;
	f[2*t].b2%=m;
	f[2*t].b1%=m;
	f[2*t+1].x%=m;
	f[2*t+1].b2%=m;
	f[2*t+1].b1%=m;
	int mid;
	mid=f[t].l+f[t].r;
	mid/=2;
	if(r<=mid){
		qj(2*t,l,r,x);
	}else if(l>mid){
		qj(2*t+1,l,r,x);
	}else{
		qj(2*t,l,mid,x);
		qj(2*t+1,mid+1,r,x);
	}
	f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(r-l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(r-l+1));
}
int jj(int t,int l,int r){
	if(l==f[t].l&&r==f[t].r){
		f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
		f[2*t].b1*=f[t].b1;
		f[2*t].b2*=f[t].b1;
		f[2*t].b2+=f[t].b2;
		f[2*t+1].b1*=f[t].b1;
		f[2*t+1].b2*=f[t].b1;
		f[2*t+1].b2+=f[t].b2;
		f[t].b1=1;
		f[t].b2=0;
		f[t].x%=m;
		f[t].b2%=m;
		f[t].b1%=m;
		f[2*t].x%=m;
		f[2*t].b2%=m;
		f[2*t].b1%=m;
		f[2*t+1].x%=m;
		f[2*t+1].b2%=m;
		f[2*t+1].b1%=m;
		return f[t].x;
	}	
	f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
	f[2*t].b1*=f[t].b1;
	f[2*t].b2*=f[t].b1;
	f[2*t].b2+=f[t].b2;
	f[2*t+1].b1*=f[t].b1;
	f[2*t+1].b2*=f[t].b1;
	f[2*t+1].b2+=f[t].b2;
	f[t].b1=1;
	f[t].b2=0;
	f[t].x%=m;
	f[t].b2%=m;
	f[t].b1%=m;
	f[2*t].x%=m;
	f[2*t].b2%=m;
	f[2*t].b1%=m;
	f[2*t+1].x%=m;
	f[2*t+1].b2%=m;
	f[2*t+1].b1%=m;
	int mid;
	mid=f[t].l+f[t].r;
	mid/=2;
	if(r<=mid){
		return jj(2*t,l,r);
	}else if(l>mid){
		return jj(2*t+1,l,r);
	}else{
		return jj(2*t,l,mid)+jj(2*t+1,mid+1,r);
	}
}
signed main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++){
		cin>>aa[i];
		aa[i]+=aa[i-1];
	}
	inite(1,n,1);
	for(int i=1;i<=q;i++){
		int s;
		cin>>s;
		if(s==1){
			int x,y,k;
			cin>>x>>y>>k;
			qc(1,x,y,k);
		}else if(s==2){
			int x,y,k;
			cin>>x>>y>>k;
			qj(1,x,y,k);
		}else{
			int x,y;
			cin>>x>>y;
			cout<<jj(1,x,y)%m<<endl;
		}
		/*for(int i=1;f[i].b1>0;i++){
			cout<<i<<"-"<<f[i].l<<"~"<<f[i].r<<":"<<f[i].b1<<"*("<<f[i].x<<")+"<<f[i].b2<<endl;
		}*/
	}
	return 0;
}//AC in 1,3,4
2023/11/23 14:29
加载中...