对着题解改到除了码风都一样了,不知道为什么还是WA0PTS。 能过样例,这里给一组不能通过测试数据 。
8 10 571373 5929 7152 8443 6028 8580 5449 8473 4237 2 4 8 4376 1 2 8 9637 2 2 6 7918 2 5 8 5681 3 2 8 1 1 5 6482 3 1 5 1 5 8 8701 2 5 8 7992 2 5 8 7806
478836 562114
code:
#include<bits/stdc++.h>
#define int long long
#define up(x) sum[x]=(sum[x<<1]+sum[(x<<1)|1])%mod
using namespace std;
const int N=1e5+5;
int n,m,mod,a[N],sum[N*4],l1[N*4],l2[N*4];
void dowm(int l,int r,int i){
int mid=(l+r)>>1;
sum[i<<1]=(sum[i<<1]*l1[i])%mod;
sum[(i<<1)|1]=(sum[(i<<1)|1]*l1[i])%mod;
sum[i<<1]=(sum[i<<1]+(mid-l+1)*l2[i])%mod;
sum[(i<<1)|1]=(sum[(i<<1)|1]+(r-mid)*l2[i])%mod;
l1[i<<1]=(l1[i<<1]*l1[i])%mod;
l1[(i<<1)|1]=(l1[(i<<1)|1]*l1[i])%mod;
l2[i<<1]=(l2[i<<1]*l1[i]+l2[i])%mod;
l2[(i<<1)|1]=(l2[(i<<1)|1]*l1[i]+l2[i])%mod;
l1[i]=1;
l2[i]=0;
}
void build(int l,int r,int i){
l1[i]=1;
l2[i]=0;
if(l==r){ sum[i]=(a[l])%mod; return;}
int mid=(l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,(i<<1)|1);
up(i);
}
void add1(int li,int ri,int k,int l,int r,int i){
if(li<=l&&ri>=r) {l1[i]=(l1[i]*k)%mod; l2[i]=(l2[i]*k)%mod; sum[i]=(sum[i]*k)%mod; return ;}
int mid=(l+r)>>1;
// if(l2[i]||l1[i]!=1)
dowm(l,r,i);
if(mid>=li) add1(li,ri,k,l,mid,i<<1);
if(mid+1<=ri) add1(li,ri,k,mid+1,r,(i<<1)|1);
up(i);
}
void add2(int li,int ri,int k,int l,int r,int i){
if(li<=l&&ri>=r) {l2[i]=(l2[i]+k)%mod; sum[i]=(sum[i]+k*(r-l+1))%mod; return;}
int mid=(l+r)>>1;
// if(l2[i]||l1[i]!=1)
dowm(l,r,i);
if(mid>=li) add2(li,ri,k,l,mid,i<<1);
if(mid+1<=ri) add2(li,ri,k,mid+1,r,(i<<1)|1);
up(i);
}
int q(int li,int ri,int l,int r,int i){
int res=0,mid=(l+r)>>1;
if(li<=l&&ri>=r) return sum[i];
// if(l2[i]||l1[i]!=1)
dowm(l,r,i);
if(mid>=li) res=(res+q(li,ri,l,mid,i<<1))%mod;
if(mid+1<=ri) res=(res+q(li,ri,mid+1,r,(i<<1)|1))%mod;
return res%mod;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,n,1);
for(int i=1,x,y,z;i<=m;i++){
scanf("%lld",&x);
if(x==1){
scanf("%lld%lld%lld",&x,&y,&z);
add1(x,y,z,1,n,1);
}
if(x==2){
scanf("%lld%lld%lld",&x,&y,&z);
add2(x,y,z,1,n,1);
}
if(x==3){
scanf("%lld%lld",&x,&y);
int ans=q(x,y,1,n,1)%mod;
printf("%lld\n",ans);
}
}
return 0;
}