全WA,求条
查看原帖
全WA,求条
1277240
pilizhou楼主2025/7/23 10:32
//区间修改(乘/加),区间查询 
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Tree{
	int l,r;
	int sum;
	int plz,mlz;
};
Tree tree[2000005];
int n,m,mod,a[500005];
void build(int k,int left,int right){//建树 
	tree[k].l=left;
	tree[k].r=right;
	tree[k].mlz=1;
	if(left==right){
		tree[k].sum=a[left]%mod;
		return;
	}
	int mid=(left+right)>>1;
	build(k*2,left,mid);
	build(k*2+1,mid+1,right);
	tree[k].sum=(tree[k*2].sum+tree[k*2+1].sum)%mod;
}
void pushdown(int k){//标记 
	int mid=(tree[k].l+tree[k].r)>>1;
	tree[k*2].sum=(tree[k].mlz*tree[k*2].sum+((mid-tree[k].l+1)*tree[k].plz)%mod)%mod;
	tree[k*2+1].sum=(tree[k].mlz*tree[k*2+1].sum+((tree[k].r-mid)*tree[k].plz)%mod)%mod;
	tree[k*2].mlz=(tree[k*2].mlz*tree[k].mlz)%mod;
	tree[k*2+1].mlz=(tree[k*2+1].mlz*tree[k].mlz)%mod;
	tree[k*2].plz=(tree[k*2].plz*tree[k].mlz+tree[k*2].plz)%mod;
	tree[k*2+1].plz=(tree[k*2+1].plz*tree[k].mlz+tree[k*2+1].plz)%mod;
}
void add(int k,int left,int right,int num){//+ 
	if(left<=tree[k].l&&tree[k].r<=right){
		tree[k].sum=(tree[k].sum+num*(tree[k].r-tree[k].l+1))%mod;
		tree[k].plz=(tree[k].plz+num)%mod;
		return;
	}
	pushdown(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(left<=mid)add(k*2,left,right,num);
	if(mid<right)add(k*2+1,left,right,num);
	tree[k].sum=(tree[k*2].sum+tree[k*2+1].sum)%mod; 
} 
void mul(int k,int left,int right,int num){//* 
	if(left<=tree[k].l&&tree[k].r<=right){
		tree[k].sum=(tree[k].sum*num)%mod;
		tree[k].mlz=(tree[k].mlz*num)%mod;
		tree[k].plz=(tree[k].plz*num)%mod;
		return;
	}
	pushdown(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(left<=mid)mul(k*2,left,right,num);
	if(mid<right)mul(k*2+1,left,right,num);
	tree[k].sum=(tree[k*2].sum+tree[k*2+1].sum)%mod; 
} 
int query(int k,int left,int right){//查询
	if(left<=tree[k].l&&tree[k].r<=right)return tree[k].sum;
	pushdown(k); 
	int ans=0;
	if(tree[k*2].r>=left)ans=(ans+query(k*2,left,right))%mod;
	if(tree[k*2+1].l<=right)ans=(ans+query(k*2+1,left,right))%mod;
	return ans;
}
signed main(){
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	} 
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;
			mul(1,x,y,k);
		}
		if(op==2){
			int x,y,k;
			cin>>x>>y>>k;
			add(1,x,y,k);
		}
		else{
			int x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		} 
	}
	return 0;
}

2025/7/23 10:32
加载中...