发现区间加的时候有问题,但是找不到代码的错误,求助
查看原帖
发现区间加的时候有问题,但是找不到代码的错误,求助
262874
lisahu楼主2021/2/7 13:48
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int  MAXN =1e5+5;
ll n,m,p;
ll a[MAXN];
struct T{
	ll sum,l,r,s1,s2;
}tree[MAXN*4];
void build(ll id,ll l,ll r){
	tree[id].l=l,tree[id].r=r;
	tree[id].s1=1,tree[id].s2=0;
	if(l==r){
		tree[id].sum=a[l];
	}
	else{
		ll mid=(l+r)/2;
		build(id*2,l,mid);
		build(id*2+1,mid+1,r);
		tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
	}
	return ;
}
void pushdown(ll id){
	tree[id*2].sum=(tree[id*2].sum*tree[id].s1+tree[id].s2*(tree[id*2].r-tree[id*2].l+1))%p;
	tree[id*2].s1=(tree[id].s1*tree[id*2].s1)%p;
	tree[id*2].s2=(tree[id*2].s2+tree[id].s2)%p;
	tree[id*2+1].sum=(tree[id*2+1].sum*tree[id].s1+tree[id].s2*(tree[id*2+1].r-tree[id*2+1].l+1))%p;
	tree[id*2+1].s1=(tree[id*2+1].s1*tree[id].s1)%p;
	tree[id*2+1].s2=(tree[id*2+1].s2+tree[id].s2)%p;
	
	tree[id].s1=1;
	tree[id].s2=0;
}

void muti(ll id,ll l,ll r,ll val){
	if(l<=tree[id].l&&tree[id].r<=r){
	
		tree[id].s2=(tree[id].s2*val)%p;
		
		tree[id].sum=(tree[id].sum*val)%p;
		tree[id].s1=(tree[id].s1*val)%p;
	}
	else{
		pushdown(id);
		ll mid=(tree[id].l+tree[id].r)/2;
		if(l<=mid) muti(id*2,l,r,val);
		if(mid<r) muti(id*2+1,l,r,val);
		tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
		tree[id].sum%=p;
	}
	return ;
}
void add(ll id,ll l,ll r,ll val){
	if(l<=tree[id].l&&tree[id].r<=r){
		tree[id].sum=(tree[id].sum+(tree[id].r-tree[id].l+1)*val)%p;
		tree[id].s2=(tree[id].s2+val)%p;
	}
	else{
		pushdown(id);
		ll mid=(tree[id].l+tree[id].r)/2;
		if(l<=mid) muti(id*2,l,r,val);
		if(mid<r) muti(id*2+1,l,r,val);
		tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
		tree[id].sum%=p;
	}
	return ;
}
ll s(ll id,ll l,ll r){
	if(l<=tree[id].l&&tree[id].r<=r){
		return tree[id].sum;
	}
	pushdown(id);
	ll ans=0,mid=(tree[id].l+tree[id].r)/2;
	if(l<=mid) ans+=s(id*2,l,r);
	if(mid<r) ans+=s(id*2+1,l,r);
	return ans;
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&p);
	for(int i=1;i<=n;i++){
		scanf("%lld",a+i);
	}
	build(1,1,n);
	while(m--){
		int opt;
		scanf("%d",&opt);
		if(opt==1){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			muti(1,x,y,k);
		}
		if(opt==2){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			add(1,x,y,k);
		}
		if(opt==3){
			ll x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",s(1,x,y)%p);
		}
	}
	return 0;
}
2021/2/7 13:48
加载中...