求条P3373
查看原帖
求条P3373
592781
zsz0804_楼主2024/11/23 11:51

本人时间不够充裕,还请大佬帮忙看看。

样例输出:17 2

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls (p<<1)
#define rs (p<<1|1)
const int N=1e5+10;
int mod,a[N];
ll t[N*4],taga[N*4],tagm[N*4];
void update(int p){
	t[p]=(t[ls]+t[rs])%mod;
}
void build(int p,int pl,int pr){
	taga[p]=0;
	tagm[p]=1;
	if(pl==pr){
		t[p]=a[pl];
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls,pl,mid);
	build(rs,mid+1,pr);
	update(p);
}
void tagd3(int p,int pl,int pr){
	int mid=(pl+pr)>>1;
	t[ls]=t[ls]*tagm[p]%mod+taga[p]*(mid-pl+1)%mod;
	t[rs]=t[rs]*tagm[p]%mod+taga[p]*(pr-mid)%mod;
	tagm[ls]=tagm[ls]*tagm[p]%mod;
	tagm[rs]=tagm[rs]*tagm[p]%mod;
	taga[ls]=(taga[ls]*tagm[p]%mod+taga[p])%mod;
	taga[rs]=(taga[rs]*tagm[p]%mod+taga[p])%mod;
	taga[p]=0;
	tagm[p]=1;
}
void cha(int p,int pl,int pr,int l,int r,int k){
	if(l<=pl&&pr<=r){
		taga[p]=(taga[p]+k)%mod;
		t[p]=(t[p]+(pr-pl+1)*k)%mod;
		return;
	}
	tagd3(p,pl,pr);
	int mid=(pl+pr)>>1;
	if(l<=mid)cha(ls,pl,mid,l,r,k);
	if(r>mid)cha(rs,mid+1,pr,l,r,k);
	update(p);
}
void chm(int p,int pl,int pr,int l,int r,int k){
	if(l<=pl&&pr<=r){
		t[p]=(t[p]*k)%mod;
		tagm[p]=(tagm[p]*k)%mod;
		taga[p]=(taga[p]*k)%mod;
		return;
	}
	tagd3(p,pl,pr);
	int mid=(pl+pr)>>1;
	if(l<=mid)chm(ls,pl,mid,l,r,k);
	if(mid<r)chm(rs,mid+1,pr,l,r,k);
	update(p);
}
ll q3(int p,int pl,int pr,int l,int r){
	if(l<=pl&&pr<=r){
		return t[p];
	}
	tagd3(p,pl,pr);
	int mid=(pl+pr)>>1;
	ll ans=0;
	if(l<=mid)ans=ans+q3(ls,pl,mid,l,r)%mod;
	if(r>mid)ans=ans+q3(rs,mid+1,pr,l,r)%mod;
	return ans%mod;
}
int main(){
	int n,q,x,y,k,op;
	scanf("%d%d%d",&n,&q,&mod);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	while(q--){
		scanf("%d%d%d",&op,&x,&y);
		if(op==1){
			scanf("%d",&k);
			chm(1,1,n,x,y,k);
		}else if(op==2){
			scanf("%d",&k);
			cha(1,1,n,x,y,k);
		}else{
			cout<<q3(1,1,n,x,y)%mod<<endl; 
		}
	}
	return 0;
}
2024/11/23 11:51
加载中...