蒟蒻求助,样例过了0分,悬赏关注
查看原帖
蒟蒻求助,样例过了0分,悬赏关注
637073
wujingfey楼主2023/7/11 19:59
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10; 
int n,m,mod,a[N];
int sum[N<<2],tag1[N<<2],tag2[N<<2];//tag1加减,tag2乘除
inline int ls(int p){//求左儿子编号 
	return p<<1;
}
inline int rs(int p){//求右儿子编号 
	return p<<1|1;
}
inline void push_up(int p){//向上整合sum 
	sum[p]=(sum[ls(p)]+sum[rs(p)])%mod;
}
inline void build(int l,int r,int p){//建树 
	tag1[p]=0,tag2[p]=1;
	if(l==r){
		sum[p]=a[l]%mod;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	push_up(p);
}
inline void f1(int l,int r,int p,int k){//打+标记 
	tag1[p]=(tag1[p]+k)%mod;
	sum[p]=(sum[p]+(r-l+1)*k)%mod;
}
inline void f2(int l,int r,int p,int k){//打*标记 
	tag1[p]=(tag1[p]*k)%mod;
	tag2[p]=(tag2[p]*k)%mod;
	sum[p]=(sum[p]*k)%mod;
}
inline void push_down1(int l,int r,int p){//传递+标记 
	int mid=(l+r)>>1;
	f1(l,mid,ls(p),tag1[p]);
	f1(mid+1,r,rs(p),tag1[p]);
	tag1[p]=0;
}
inline void push_down2(int l,int r,int p){//传递*标记 
	int mid=(l+r)>>1;
	f2(l,mid,ls(p),tag2[p]);
	f2(mid+1,r,rs(p),tag2[p]);
	tag2[p]=1;
}
inline void updata1(int nl,int nr,int l,int r,int p,int k){//+更改 
	if(nl<=l&&r<=nr){
		f1(l,r,p,k);
		return;
	}
	push_down1(l,r,p);
	int mid=(l+r)>>1;
	if(nl<=mid) updata1(nl,nr,l,mid,ls(p),k);
	if(mid+1<=nr) updata1(nl,nr,mid+1,r,rs(p),k);
	push_up(p);
}
inline void updata2(int nl,int nr,int l,int r,int p,int k){//*更改 
	if(nl<=l&&r<=nr){
		f2(l,r,p,k);
		return;
	}
	push_down2(l,r,p);
	int mid=(l+r)>>1;
	if(nl<=mid) updata2(nl,nr,l,mid,ls(p),k);
	if(mid+1<=nr) updata2(nl,nr,mid+1,r,rs(p),k);
	push_up(p);
}
inline int query(int nl,int nr,int l,int r,int p){//查询 
	int res=0;
	if(nl<=l&&r<=nr){
		return sum[p];
	}
	push_down1(l,r,p);
	push_down2(l,r,p);
	int mid=(l+r)>>1;
	if(nl<=mid) res=(res+query(nl,nr,l,mid,ls(p)))%mod;
	if(mid+1<=nr) res=(res+query(nl,nr,mid+1,r,rs(p)))%mod;
	return res%mod;
}
signed main(){
	scanf("%d%d%d",&n,&m,&mod);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int k,x,y,z;
		scanf("%d",&k);
		if(k==1){
			scanf("%d%d%d",&x,&y,&z);
			updata2(x,y,1,n,1,z);
		}else if(k==2){
			scanf("%d%d%d",&x,&y,&z);
			updata1(x,y,1,n,1,z);
		}else if(k==3){
			scanf("%d%d",&x,&y);
			printf("%d\n",query(x,y,1,n,1));
		}
	}
	return 0;
}

2023/7/11 19:59
加载中...