30分求助QAQ
查看原帖
30分求助QAQ
229529
yyewenh楼主2020/4/30 11:50
#include<iostream>
#include<cstdio>
#define ll long long 
using namespace std; 
const int N=1000010;
int n,m,mod,a[N],tag[N<<2],ans[N<<2],tx[N<<2];
inline ll ls(ll x){
	return x<<1;
}
inline ll rs(ll x){
	return x<<1|1;
}
inline void push_up(ll p){
	ans[p]=(ans[ls(p)]+ans[rs(p)])%mod;
}
void build(ll l,ll r,ll p){
    tx[p]=1;
	if(l==r){
		ans[p]=a[l]%mod;
		return;
	}
	ll mid=(l+r)>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	push_up(p);
}
inline void push_down(ll p,ll l,ll r){
	ll mid=(l+r)>>1;ll xl=ls(p),xr=rs(p);
	ans[xl]=(tx[p]*ans[xl]+((mid-l+1)*tag[p])%mod)%mod;
	ans[xr]=(tx[p]*ans[xr]+((r-mid)*tag[p])%mod)%mod;
	tx[xl]=(tx[xl]*tx[p])%mod;
	tx[xr]=(tx[xr]*tx[p])%mod;
	tag[xl]=(tag[xl]*tx[p]+tag[p])%mod;
	tag[xr]=(tag[xr]*tx[p]+tag[p])%mod;
	tag[p]=0;tx[p]=1;	

}
void xf(ll fl,ll fr,ll l,ll r,ll p,ll k){
	if(fl<=l&&fr>=r){
		tag[p]=(tag[p]*k)%mod;
		tx[p]=(tx[p]*k)%mod;
		ans[p]=(ans[p]*k)%mod;
		return;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(fl<=mid)xf(fl,fr,l,mid,ls(p),k);
	if(fr>mid)xf(fl,fr,mid+1,r,rs(p),k);
	push_up(p);
}
void jf(ll fl,ll fr,ll l,ll r ,ll p,ll k){
	if(fl<=l&&fr>=r){
		ans[p]=(ans[p]+k*(r-l+1))%mod;
		tag[p]=(tag[p]+k)%mod;
		return;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(fl<=mid)jf(fl,fr,l,mid,ls(p),k);
	if(fr>mid)jf(fl,fr,mid+1,r,rs(p),k);
	push_up(p);
}
 ll prin(ll fl,ll fr,ll l,ll r,ll p){
	if(fl<=l&&fr>=r)
	return ans[p];
	ll sum=0;
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(fl<=mid)sum=(sum+prin(fl,fr,l,mid,ls(p)))%mod;
	if(mid<fr)sum=(sum+prin(fl,fr,mid+1,r,rs(p)))%mod;
	return sum;
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int t;
		scanf("%d",&t);
		if(t==1){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			xf(x,y,1,n,1,k); 
		}
		else if(t==2){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			jf(x,y,1,n,1,k);
		}
		else if(t==3){
			ll x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",prin(x,y,1,n,1)%mod);
		}
	}
	return 0;
}
2020/4/30 11:50
加载中...