全RE求调
查看原帖
全RE求调
600052
mosteryu楼主2022/5/10 19:38

RT

#include<bits/stdc++.h>
using namespace std;
long long n,m,number[100001],mod;
struct node{
	long long l,r,sum,lazymul,la;
}a[100001];
void build(long long k,long long l,long long r){
	a[k].l=l;
	a[k].r=r;
	a[k].lazymul=1;
	if(l==r) a[k].sum=number[k];
	long long mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	a[k].sum=a[k*2].sum+a[k*2+1].sum;
}
void pushdown(long long k){
	a[k*2].sum=(a[k].lazymul*a[k*2].sum+(a[k*2].r-a[k*2].l+1)*a[k].la%mod)%mod;
	a[k*2+1].sum=(a[k].lazymul*a[k*2+1].sum+(a[k*2+1].r-a[k*2+1].l+1)*a[k].la%mod)%mod;
	a[k*2].lazymul=(a[k*2].lazymul*a[k].lazymul%mod);
	a[k*2+1].lazymul=a[k*2+1].lazymul*a[k].lazymul%mod;
	a[k*2].la=(a[k*2].la*a[k].lazymul+a[k].la)%mod;
	a[k*2+1].la=(a[k*2+1].la*a[k].lazymul+a[k].lazymul)%mod;
	a[k].lazymul=1;
	a[k].la=0;
}
void changeSegment(long long k,long long l,long long r,long long x){
	if(a[k].l>=l && a[k].r>=r){
		a[k].la=(a[k].la+x)%mod;
		a[k].sum=(a[k].sum+x*(a[k].r-a[k].l+1))%mod;
		return;
	}
	pushdown(k);
	a[k].sum=(a[k*2].sum+a[k*2+1].sum)%mod;
	long long mid=(a[k].l+a[k].r)/2;
	if(l<=mid){
		changeSegment(k*2,l,r,x);
	}
	if(mid<r){
		changeSegment(k*2+1,l,r,x);
	} 
	a[k].sum=(a[k*2].sum+a[k*2+1].sum)%mod; 
}
void mul(long long k,long long l,long long r,long long x){
	if(a[k].l>=l && a[k].r<=r){
		a[k].la=(a[k].la*x)%mod;
		a[k].lazymul=(a[k].lazymul*x)%mod;
		a[k].sum=(a[k].sum*x)%mod;
	}
	pushdown(k);
	a[k].sum=a[k*2].sum+a[k*2+1].sum;
	long long mid=(a[k].l+a[k].r)/2;
	if(l<=mid){
		mul(k*2,l,r,x);
	}
	if(mid<r){
		mul(k*2+1,l,r,x);
	}
	a[k].sum=(a[k*2].sum+a[k*2+1].sum%mod);
}
long long query(long long k,long long l,long long r){
	if(a[k].l>=l&&a[k].r<=r){
		return a[k].sum;
	}
	pushdown(k);
	long long popi=0;
	long long mid=(a[k].l+a[k].r)/2;
	if(l<=mid){
		popi=(popi+query(k*2,l,r))%mod;
	}
	if(mid<r){
		popi=(popi+query(k*2+1,l,r))%mod;
	}
	return popi;
}
int main(){
	cin>>n>>m>>mod;
	for(long long i=1;i<n;i++){
		cin>>number[i];
	}
	build(1,1,n);
	for(long long i=0;i<m;i++){
		int q;
		cin>>q;
		if(q==1){
			long long w,e,t;
			cin>>w>>e>>t;
			mul(1,w,e,t);
		}else if(q==2){
			long long w,e,t;
			cin>>w>>e>>t;
			changeSegment(1,w,e,t);
		}else{
			long long w,e;
			cin>>w>>e;
			cout<<query(1,w,e);
		}
	}
	return 0;
}

2022/5/10 19:38
加载中...