样例未过在线玄关求助
查看原帖
样例未过在线玄关求助
939292
chenshixue楼主2024/7/3 16:16
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+3;
int a[maxn];
struct node{
	ll sum,la1,la2;
	bool lc;
}tree[maxn<<2];
ll n,m,Q;
void up(int k){
	tree[k].sum=(tree[k<<1].sum+tree[k<<1|1].sum)%m;
	return; 
}
void down(int k,int na,int nb){
	//乘法下放 
	if(tree[k].lc==1){
		//向左下放
		tree[k<<1].sum=(tree[k<<1].sum*tree[k].la2)%m;
		tree[k<<1].la1=(tree[k<<1].la1*tree[k].la2)%m;
		if(tree[k<<1].lc==1){
			tree[k<<1].la2=(tree[k<<1].la2*tree[k].la2)%m;
		}else{
		    tree[k<<1].la2=tree[k].la2;
		    tree[k<<1].lc=true;
		}
		
		//向右下放 
		tree[k<<1|1].sum=(tree[k<<1|1].sum*tree[k].la2)%m;
		tree[k<<1].la1=(tree[k<<1|1].la1*tree[k].la2)%m;
		if(tree[k<<1|1].lc==1){
			tree[k<<1|1].la2=(tree[k<<1|1].la2*tree[k].la2)%m;
		}else{
		    tree[k<<1|1].la2=tree[k].la2;
		    tree[k<<1|1].lc=true;
		}
		tree[k].lc=0;
		tree[k].lc=0;
	}
	//加法下放 
	if(tree[k].la1!=0){
		tree[k<<1].sum=(na*tree[k].la1+tree[k<<1].sum)%m;
	    tree[k<<1].la1=(tree[k].la1+tree[k<<1].la1)%m;
	    tree[k<<1|1].sum=(nb*tree[k].la1+tree[k<<1|1].sum)%m;
	    tree[k<<1|1].la1=(tree[k<<1|1].la1+tree[k].la1)%m;
		tree[k].la1=0;
	}
}
void build(int l,int r,int k){
	if(l==r){
		tree[k].sum=a[l];
		return;
	}
	int M=(l+r)>>1;
	build(l,M,k<<1);
	build(M+1,r,k<<1|1);
	up(k);
}
void add(int ql,int qr,int c,int l,int r,int k){
	if(ql<=l&&qr>=r){
		tree[k].sum=(tree[k].sum+((r-l+1)*c)%m)%m;
		tree[k].la1=(tree[k].la1+c)%m;
		return;
	}
	int M=(l+r)>>1;
	down(k,m-l+1,r-M);
	if(ql<=M) add(ql,qr,c,l,M,k<<1);
 	if(qr>M)add(ql,qr,c,M+1,r,k<<1|1);
	up(k);
}
int q(int ql,int qr,int l,int r,int k){
	if(ql>=l&&qr<=r){
		return tree[k].sum;
	}
	ll ans=0;
	int M=(l+r)>>1;
	down(k,M-l+1,r-M);
	if(ql<=M)ans+=q(ql,qr,l,M,k<<1);
	if(qr>M)ans+=q(ql,qr,M+1,r,k<<1|1);
	up(k);
	return ans;
}
void mul(int ql,int qr,int c,int l, int r,int k){
	if(ql<=l&&qr>=r){
		tree[k].sum=((ll)tree[k].sum*c)%m;
		tree[k].la1=((ll)tree[k].la1*c)%m;
		if(tree[k].lc==1){
			tree[k].la2=((ll)tree[k].la2*c)%m;
		}else{
		    tree[k].la2=c;
		    tree[k].lc=true;
		}
		return ;
	}
	int M=(l+r)>>1;
	down(k,M-l+1,r-M);
	if(ql<=M) mul(ql,qr,c,l,M,k<<1);
    if(qr>M) mul(ql,qr,c,M+1,r,k<<1|1);
	up(k); 
}
int main(){
	cin>>n>>Q>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	for(int i=1;i<=Q;i++){
		int p;
		cin>>p;
		if(p==1){
			//乘法
			int x,y,k;
			cin>>x>>y>>k;
			mul(x,y,k,1,n,1);
		}else if(p==2){
			//加法
			int x,y,k;
			cin>>x>>y>>k;
			add(x,y,k,1,n,1); 
		}else{
			//询问 
			int x,y;
			cin>>x>>y;
			cout<<q(x,y,1,n,1)<<endl;
		}
	}
	return 0;
}
2024/7/3 16:16
加载中...