0分,全WA
查看原帖
0分,全WA
1231078
bjzjh楼主2024/10/16 16:08
#include<bits/stdc++.h>
using namespace std;
int m,a[100005],n,q,op,x,y,z;
struct node{
	int l,r,num,tag1,tag2;
}tree[400005];
inline int ql(int q){
	return q<<1;
} 
inline int qr(int q){
	return q<<1|1;
} 
void MOD(int q){
	tree[q].num%=m;
}
void push_up(int q){
	tree[q].num=tree[ql(q)].num+tree[qr(q)].num;
	MOD(q);
}
void push_down1(int q){
	tree[ql(q)].num*=tree[q].tag1;
	MOD(ql(q));
	tree[ql(q)].tag1*=tree[q].tag1;
	tree[qr(q)].num*=tree[q].tag1;
	MOD(qr(q));
	tree[qr(q)].tag1*=tree[q].tag1;
	tree[q].tag1=1;
}
void push_down2(int q){
	tree[ql(q)].num+=tree[q].tag2*(tree[ql(q)].r-tree[ql(q)].l+1);
    MOD(ql(q));
	tree[ql(q)].tag2+=tree[q].tag2;
	tree[qr(q)].num+=tree[q].tag2*(tree[qr(q)].r-tree[qr(q)].l+1);
	MOD(qr(q));
	tree[qr(q)].tag2+=tree[q].tag2;
	tree[q].tag2=0;
}
void push_down(int q){push_down2(q);
	push_down1(q);
}
void build(int q,int l,int r){
	tree[q].l=l;
	tree[q].r=r;
	tree[q].tag1=1;
	if(l==r){
		tree[q].num=a[l];
		tree[q].num%=m;
		return; 
	}
	int mid=l+r>>1;
	build(ql(q),l,mid);
	build(qr(q),mid+1,r);
	push_up(q);
} 
void updata1(int q,int l,int r,int k){
	if(tree[q].l>=l&&tree[q].r<=r){
		tree[q].num*=k;
		tree[q].tag1*=k;
		return; 
	} 
	push_down1(q);
	int mid=(tree[q].l+tree[q].r)>>1;
	if(mid>=l) updata1(ql(q),l,r,k);
	if(r>mid) updata1(qr(q),l,r,k);
	push_up(q); 
}
void updata2(int q,int l,int r,int k){
	if(tree[q].l>=l&&tree[q].r<=r){
		tree[q].num+=k*(tree[q].r-tree[q].l+1);
		tree[q].tag2+=k;
		return; 
	} 
	push_down2(q);
	int mid=(tree[q].l+tree[q].r)>>1;
	if(mid>=l) updata2(ql(q),l,r,k);
	if(r>mid) updata2(qr(q),l,r,k);
	push_up(q); 
}
int query(int l,int r,int q){
	if(tree[q].l>=l&&tree[q].r<=r){
		return tree[q].num;
	}
	if(tree[q].r<l||tree[q].l>r){
		return 0;
	}
	push_down(q);
	int ans=0;
	int mid=(tree[q].l+tree[q].r)>>1;
	if(mid>=l){
		ans+=query(l,r,ql(q));
		ans%=m;
	}
	if(r>mid){
		ans+=query(l,r,qr(q));
		ans%=m;
	}
	return ans;
}
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n); 
	for(int i=1;i<=q;i++){
		cin>>op;
		if(op==1){
			cin>>x>>y>>z;
			updata1(1,x,y,z);
		}
		if(op==2){
			cin>>x>>y>>z;
			updata2(1,x,y,z);
		}
		if(op==3){
			cin>>x>>y;
			cout<<query(x,y,1)<<endl;
		} 
	}
}
2024/10/16 16:08
加载中...