求助!
查看原帖
求助!
64558
Alan0627楼主2020/10/23 12:01

样例过了,测试全wa

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define N 200005
struct nod{
	int l,r,add,sum,mul;
}t[N<<2];
int n,m,mod,a[N];
inline void build(int l,int r,int p){
	t[p].l=l,t[p].r=r,t[p].mul=1;
	if(l==r){
		t[p].sum=a[l]%mod;
		return;
	}
	int mid=(t[p].l+t[p].r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	t[p].sum=(t[p<<1].sum+t[p<<1|1].sum)%mod;
}
inline void spread(int p){
	if(t[p].add){
		t[p<<1].sum=(t[p].mul*t[p<<1].sum)%mod+(t[p].add*(t[p<<1].r-t[p<<1].l+1))%mod;
		t[p<<1].sum%=mod;
		t[p<<1|1].sum=(t[p].mul*t[p<<1|1].sum)%mod+(t[p].add*(t[p<<1|1].r-t[p<<1|1].l+1))%mod;
		t[p<<1|1].sum%=mod;
		
		t[p<<1].add=t[p].add+(t[p].mul*t[p<<1].add)%mod;
		t[p<<1].add%=mod;
		t[p<<1|1].add=t[p].add+(t[p].mul*t[p<<1|1].add)%mod;
		t[p<<1|1].add%=mod;
		
		t[p<<1].mul=(t[p].mul*t[p<<1].mul)%mod;
		t[p<<1|1].mul=(t[p].mul*t[p<<1|1].mul)%mod;
		
		t[p].add=0;
		t[p].mul=1;
	}
}
inline void change_mul(int l,int r,int k,int p){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].add=(t[p].add*k)%mod;
		t[p].mul=(t[p].mul*k)%mod;
		t[p].sum=(t[p].sum*k)%mod;
		return;
	}
	spread(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)change_mul(l,r,k,p<<1);
	if(mid<r)change_mul(l,r,k,p<<1|1);
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
	t[p].sum%=mod;
}
inline void change_add(int l,int r,int k,int p){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].add=(t[p].add+k)%mod;
		t[p].sum=(t[p].sum+k*(t[p].r-t[p].l+1))%mod;
		return;
	}
	spread(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)change_add(l,r,k,p<<1);
	if(mid<r)change_add(l,r,k,p<<1|1);
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
	t[p].sum%=mod;
}
inline int getsum(int l,int r,int p){
	if(l<=t[p].l&&t[p].r<=r){
		return t[p].sum%mod;
	}
	spread(p);
	int ans=0;
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)ans=(ans+getsum(l,r,p<<1))%mod;
	if(mid<r)ans=(ans+getsum(l,r,p<<1|1))%mod;
	return ans%mod;
}
signed main(){
	scanf("%lld%lld",&n,&mod);
	for(re int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		a[i]%=mod;
	}
	scanf("%lld",&m);
	build(1,n,1);
	while(m--){
		int op;
		scanf("%lld",&op);
		if(op==1){
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			change_mul(x,y,k,1);
		}else if(op==2){
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			change_add(x,y,k,1);
		}else if(op==3){
			int x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",getsum(x,y,1));
		}
	}
	return 0;
} 
2020/10/23 12:01
加载中...