30分求调!!!
查看原帖
30分求调!!!
566190
我是歌者楼主2024/11/22 13:55
#include<bits/stdc++.h>
using namespace std;
struct node{
	long long int l,r,tag1,tag2,sum;
}tree[5001000];
long long int n,q,m;
long long int arr[2000100];
void build(int l,int r,int idx){
	tree[idx].l=l;tree[idx].r=r;tree[idx].tag1=0;tree[idx].tag2=1;
	if(l==r){
		tree[idx].sum=arr[l];
		tree[idx].sum%=m;
		return;
	} 
	long long int mid=(l+r)>>1;
	build(l,mid,idx*2);
	build(mid+1,r,idx*2+1);
	tree[idx].sum=(tree[idx*2].sum+tree[idx*2+1].sum)%m;
	return;
}
void spread(long long int idx){
	if(tree[idx].tag1!=0||tree[idx].tag2!=1){
		tree[idx*2].tag1+=tree[idx].tag1;tree[idx*2+1].tag1+=tree[idx].tag1;tree[idx*2].tag1%=m;tree[idx*2+1].tag1%=m;
		tree[idx*2].tag2*=tree[idx].tag2;tree[idx*2+1].tag2*=tree[idx].tag2;tree[idx*2].tag2%=m;tree[idx*2+1].tag2%=m;
		tree[idx*2].sum=(tree[idx*2].sum*tree[idx].tag2+tree[idx].tag1*(tree[idx*2].r-tree[idx*2].l+1)%m)%m;
		tree[idx*2+1].sum=(tree[idx*2+1].sum*tree[idx].tag2+tree[idx].tag1*(tree[idx*2+1].r-tree[idx*2+1].l+1)%m)%m;
		tree[idx].tag1=0;tree[idx].tag2=1;
	}
	return;
}
void add(long long int l,long long int r,long long int idx,long long int w){
	if(tree[idx].l>=l&&tree[idx].r<=r){
		tree[idx].tag1+=w;tree[idx].sum+=w*(tree[idx].r-tree[idx].l+1);tree[idx].sum%=m;tree[idx].sum%=m;
		return;
	}
	spread(idx);
	long long int mid=(tree[idx].l+tree[idx].r)>>1;
	if(mid>=l) add(l,r,idx*2,w);
	if(mid<r) add(l,r,idx*2+1,w);
	tree[idx].sum=tree[idx*2].sum+tree[idx*2+1].sum;tree[idx].sum%=m;
}
void mul(long long int l,long long int r,long long int idx,long long int w){
	if(tree[idx].l>=l&&tree[idx].r<=r){
		tree[idx].tag1*=w;tree[idx].tag2*=w;tree[idx].sum*=w;tree[idx].sum%=m;
		return;
	}
	spread(idx);
	long long int mid=(tree[idx].l+tree[idx].r)>>1;
	if(mid>=l) mul(l,r,idx*2,w);
	if(mid<r) mul(l,r,idx*2+1,w);
	tree[idx].sum=tree[idx*2].sum+tree[idx*2+1].sum;tree[idx].sum%=m;
}
long long int ques(long long int l,long long int r,long long int idx){
	//if(tree[idx].r<l||tree[idx].l>r) return 0;
	if(tree[idx].l>=l&&tree[idx].r<=r){
		return tree[idx].sum;
	}
	spread(idx);
	long long int ans=0,mid=(tree[idx].l+tree[idx].r)>>1;
	if(mid>=l) ans+=ques(l,r,idx*2);
	if(mid<r) ans+=ques(l,r,idx*2+1);
	ans%=m;return ans;
}
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	build(1,n,1);
	while(q--){
		int x;
		cin>>x;
		if(x==1){
			long long int l,r,w;
			cin>>l>>r>>w;
			mul(l,r,1,w);
		}
		if(x==2){
			long long int l,r,w;
			cin>>l>>r>>w;
			add(l,r,1,w);
		}
		if(x==3){
			long long int l,r;
			cin>>l>>r;
			cout<<(ques(l,r,1)%m)<<endl;
		}
	}
	return 0;
}
2024/11/22 13:55
加载中...