求助
查看原帖
求助
220509
国国の国王楼主2020/8/30 15:11
#include<bits/stdc++.h>
using namespace std;
long long p;
long long a[200000],tree[600000],laz[600000],lazz[600000];
void treemake(long long now,long long l,long long r){
	if(l==r){
		tree[now]=a[l]%p;
		return;
	}
	int mid=(l+r)/2;
	treemake(now*2,l,mid);
	treemake(now*2+1,mid+1,r);
	tree[now]=(tree[now*2]+tree[now*2+1])%p;
	lazz[now]=1;
}
void pull(long long now,long long l,long long r){
	if(!laz[now]&&lazz[now]==1) return;
	int mid=(l+r)/2;
	tree[now*2]=(tree[now*2]*lazz[now]+laz[now]*(mid-l+1))%p;
	tree[now*2+1]=(tree[now*2+1]*lazz[now]+laz[now]*(r-mid))%p;
	laz[now*2]=(laz[now*2]*lazz[now]+laz[now]);
	laz[now*2+1]=(laz[now*2+1]*lazz[now]+laz[now]);
	lazz[now*2]=(lazz[now*2]*lazz[now])%p;
	lazz[now*2+1]*=(lazz[now*2+1]*lazz[now])%p;
	laz[now]=0;
	lazz[now]=1;
}
void t2(long long now,long long l,long long r,long long ll,long long rr,long long kkk){
	if(ll<=l&&rr>=r){
		laz[now]=(laz[now]+kkk)%p;
		tree[now]=(tree[now]+kkk*(r-l+1))%p;
		return;
	}
	pull(now,l,r);
	long long mid=(l+r)/2;
	if(ll<=mid) t2(now*2,l,mid,ll,rr,kkk);
	if(rr>mid) t2(now*2+1,mid+1,r,ll,rr,kkk);
	tree[now]=(tree[now*2]+tree[now*2+1])%p;
}
long long t3(long long now,long long l,long long r,long long ll,long long rr){
	if(ll<=l&&rr>=r){
		return tree[now];
	}
	pull(now,l,r);
	long long mid=(l+r)/2,ans=0;
	if(ll<=mid) ans+=t3(now*2,l,mid,ll,rr);
	if(rr>mid) ans+=t3(now*2+1,mid+1,r,ll,rr);
	return ans%p;
}
void t1(long long now,long long l,long long r,long long ll,long long rr,long long kkk){
	if(ll<=l&&rr>=r){
		laz[now]=(laz[now]*kkk)%p;
		lazz[now]=(lazz[now]*kkk)%p;
		tree[now]=(tree[now]*kkk)%p;
		return;
	}
	pull(now,l,r);
	long long mid=(l+r)/2;
	if(ll<=mid) t1(now*2,l,mid,ll,rr,kkk);
	if(rr>mid) t1(now*2+1,mid+1,r,ll,rr,kkk);
	tree[now]=(tree[now*2]+tree[now*2+1])%p;
}
int main(){
	int n,m;
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++) cin>>a[i];
	treemake(1,1,n);
	while(m--){
		long long ll,rr,k;
		cin>>k>>ll>>rr;
		if(k==1){
			cin>>k;
			t1(1,1,n,ll,rr,k);
		}
		else if(k==2){
			cin>>k;
			t2(1,1,n,ll,rr,k);
		}
		else cout<<t3(1,1,n,ll,rr)<<endl;
	}
}
//t1 乘法
//t2 加法
//t3 求值
//laz 加法LAZZTAG
//lazz 乘法LAZZTAG

30分

2020/8/30 15:11
加载中...