P3373求调
  • 板块灌水区
  • 楼主cmsq958000
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/20 19:58
  • 上次更新2024/3/20 21:35:13
查看原帖
P3373求调
540818
cmsq958000楼主2024/3/20 19:58
#include<bits/stdc++.h>
using namespace std;

long long n,q,mod;
long long a[100005];

long long tree[400005];
long long tag[400005];
long long mul[400005];

void build(long long l,long long r,long long p){
	if(l==r){
		tree[p]=a[l];
		return;
	}
	build(l,l+(r-l)/2,p*2);
	build(l+(r-l)/2+1,r,p*2+1);
	tree[p]=tree[p*2]+tree[p*2+1];
	return;
}

void add(long long l,long long r,long long userl,long long userr,long long plus,long long place){
	if(l<=userl && r>=userr){
		tree[place]+=(r-l+1)*plus; tree[place]%=mod;
		tag[place]+=(r-l+1)*plus; return;
	}
	if(tag[place]!=0){
		tree[place*2]+=tag[place]*(r-l+1); tree[place*2+1]=tag[place]*(r-l+1);
		tree[place*2]%=mod; tree[place*2+1]%=mod;
		tag[place*2]+=tag[place]; tag[place*2+1]+=tag[place]; tag[place]=0;
	}
	long long mid=userl+(userr-userl)/2;
	if(l<=mid) add(l,r,userl,mid,plus,place*2);
	if(r>mid) add(l,r,mid+1,userr,plus,place*2+1);
	tree[place]=tree[place*2]+tree[place*2+1];
	tree[place]%=mod;
	return;
}

void multification(long long l,long long r,long long userl,long long userr,long long k,long long place){
	if(l<=userl && r>=userr){
		tree[place]*=k;
		tree[place]%=mod;
		mul[place]+=k; return;
	}
	if(mul[place]!=0){
		tree[place*2]*=mul[place]; tree[place*2+1]*=mul[place];
		tree[place*2]%=mod; tree[place*2+1]%=mod;
		mul[place*2]+=mul[place]; mul[place*2+1]+=mul[place]; mul[place]=0;
	}
	long long mid=userl+(userr-userl)/2;
	if(l<=mid) multification(l,r,userl,mid,k,place*2);
	if(r>mid) multification(l,r,mid+1,userr,k,place*2+1);
	tree[place]=tree[place*2]+tree[place*2+1]; tree[place]%=mod;
	return;
}

long long query(long long l,long long r,long long userl,long long userr,long long place){
	if(l<=userl && r>=userr){
		return tree[place]%mod;
	}
	if(tag[place]!=0){
		tree[place*2]+=tag[place]*(r-l+1); tree[place*2+1]=tag[place]*(r-l+1);
		tree[place*2]%=mod; tree[place*2+1]%=mod;
		tag[place*2]+=tag[place]; tag[place*2+1]+=tag[place]; tag[place]=0;
	}
	if(mul[place]!=0){
		tree[place*2]*=mul[place]; tree[place*2+1]*=mul[place];
		tree[place*2]%=mod; tree[place*2+1]%=mod;
		mul[place*2]+=mul[place]; mul[place*2+1]+=mul[place]; mul[place]=0;
	}
	long long sum=0;
	
	long long mid=userl+(userr-userl)/2;
	if(l<=mid) sum+=query(l,r,userl,mid,place*2),sum%=mod;
	if(r>mid) sum+=query(l,r,mid+1,userr,place*2+1),sum%=mod;
	return sum;
}

int main(){
	scanf("%lld %lld %lld",&n,&q,&mod);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,n,1);
	
	for(int i=1;i<=q;i++){
		long long op; scanf("%lld",&op);
		if(op==1){
			long long x,y,k; scanf("%lld %lld %lld",&x,&y,&k);
			multification(x,y,1,n,k,1);
		}else if(op==2){
			long long x,y,k; scanf("%lld %lld %lld",&x,&y,&k);
			add(x,y,1,n,k,1);
		}else if(op==3){
			long long x,y; scanf("%%lld %lld",&x,&y);
			cout<<query(x,y,1,n,1)<<"\n";
		}
	}
	
	
	return 0;
}


眼睛看花了

2024/3/20 19:58
加载中...