线段树摸2求助,感谢
查看原帖
线段树摸2求助,感谢
743752
yumo_楼主2022/8/17 18:04

求求dalao帮忙,不知道哪里错了

#include<bits/stdc++.h>
#define ll long long
#define Mx 100001
using namespace std;
int n,m,mod;
ll a[Mx],ans[Mx<<1],laz_add[Mx<<1],laz_mul[Mx<<1];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void Do_add(int l,int r,int p,ll k){
	laz_add[p]+=k;
	laz_add[p]%=mod;
	ans[p]+=(r-l+1)*k;ans[p]%=mod; 
}
inline void Do_mul(int p,ll k){
	laz_add[p]*=k;
	laz_add[p]%=mod;
	laz_mul[p]*=k;
	laz_mul[p]%=mod;
	ans[p]*=k;ans[p]%=mod;
}
inline void push_up(int p){
	ans[p]=(ans[ls(p)]+ans[rs(p)])%mod;
}
inline void push_down(ll l,ll r,ll p){
	int mid=(l+r)>>1;
	int l1=laz_add[p],l2=laz_mul[p];
	if(l2>1){
		Do_mul(ls(p),l2);Do_mul(rs(p),l2);
		laz_mul[p]=0;
	}
	if(l1>0){
		Do_add(l,mid,ls(p),l1);
		Do_add(mid+1,r,rs(p),l1);
		laz_add[p]=0;
	}
}
inline void build(int l,int r,int p){
	if(l==r){
		ans[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	push_up(p); 
}
inline void add(int nl,int nr,int l,int r,int p,ll k){
	if(nl<=l&&r<=nr){
		Do_add(l,r,p,k);return ;
	} 
	push_down(l,r,p);
	int mid=(l+r)>>1;
	if(nl<=mid)add(nl,nr,l,mid,ls(p),k);
	if(nr>mid)add(nl,nr,mid+1,r,rs(p),k);
	push_up(p);
}
inline void mul(int nl,int nr,int l,int r,int p,ll k){//k\=0
	if(nl<=l&&r<=nr){
		Do_mul(p,k);return ;
	}
	push_down(l,r,p);
	int mid=(l+r)>>1;
	if(nl<=mid)mul(nl,nr,l,mid,ls(p),k);
	if(nr>mid)mul(nl,nr,mid+1,r,rs(p),k);
	push_up(p);
}
inline ll query(int x,int y,int l,int r,int p){
	ll res=0;
	if(x<=l&&r<=y)return ans[p];
	push_down(l,r,p);
	ll mid=(l+r)>>1;
	if(x<=mid)res=(res+query(x,y,l,mid,ls(p)))%mod;
	if(y>mid)res=(res+query(x,y,mid+1,r,rs(p)))%mod;
	return res;
}
int main(){
	int t,x,y;ll k;
	scanf("%d%d%d",&n,&m,&mod);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);a[i]%=mod;
	}
	build(1,n,1);
	while(m--){
		scanf("%d%d%d",&t,&x,&y);
		if(t==1){
			scanf("%lld",&k);
			mul(x,y,1,n,1,k);
		/*	for(int i=1;i<=n*2;++i){
				printf("%lld\n",ans[i]);
			} */
		}
		else if(t==2){
			scanf("%lld",&k);
			add(x,y,1,n,1,k);
			/*for(int i=1;i<=n*2;++i){
				printf("%lld\n",ans[i]);
			} */
		}else{
			printf("%lld\n",query(x,y,1,n,1));
		}
	}
	return 0;
}





2022/8/17 18:04
加载中...