分块打的这道题,恒输出零,感觉不大透彻,求大佬调一调(马蜂丑请见谅)
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int kM=100010;
const int kN=1010;
int n,bl[kN],L[kN],R[kN],sum[kN];
int lazy1[kN],lazy2[kN];
int a[kM];
int p,m;
void add(int l,int r,int c)
{
if(bl[l]==bl[r])
{
for(int i=l;i<=r;i++)
{
a[i]+=c;
a[i]%=p;
sum[bl[i]]+=c;
sum[bl[i]]%=p;
}
}
else
{
int pos1=R[bl[l]],pos2=L[bl[r]];
for(int i=l;i<=pos1;i++)
{
a[i]+=c;
a[i]%=p;
sum[bl[i]]+=c;
sum[bl[i]]%=p;
}
for(int i=pos2;i<=r;i++)
{
a[i]+=c;
a[i]%=p;
sum[bl[i]]+=c;
sum[bl[i]]%=p;
}
for(int i=bl[l]+1;i<=bl[r]-1;i++)
{
lazy1[i]+=c;
}
}
}
void cheng(int l,int r,int c)
{
if(bl[l]==bl[r])
{
for(int i=l;i<=r;i++)
{
sum[bl[i]]-=a[i];
a[i]%=p;
sum[bl[i]]%=p;
a[i]*=c;
a[i]%=p;
sum[bl[i]]%=p;
sum[bl[i]]+=a[i];
a[i]%=p;
sum[bl[i]]%=p;
}
}
else
{
int pos1=R[bl[l]],pos2=L[bl[r]];
for(int i=l;i<=pos1;i++)
{
sum[bl[i]]-=a[i];
a[i]%=p;
sum[bl[i]]%=p;
a[i]*=c;
a[i]%=p;
sum[bl[i]]%=p;
sum[bl[i]]+=a[i];
a[i]%=p;
sum[bl[i]]%=p;
}
for(int i=pos2;i<=r;i++)
{
sum[bl[i]]-=a[i];
a[i]%=p;
sum[bl[i]]%=p;
a[i]*=c;
a[i]%=p;
sum[bl[i]]%=p;
sum[bl[i]]+=a[i];
a[i]%=p;
sum[bl[i]]%=p;
}
for(int i=bl[l]+1;i<=bl[r]-1;i++)
{
lazy2[i]*=c;
lazy1[i]*=c;
}
}
}
int ask(int l,int r)
{
int ans=0;
if(bl[l]==bl[r])
{
int ps=bl[l];
for(int i=l;i<=r;i++)
{
ans+=((a[i]*lazy2[ps])+lazy1[ps])%p;
ans%=p;
}
}
else
{
int pos1=R[bl[l]],pos2=L[bl[r]];
int ps1=bl[l],ps2=bl[r];
for(int i=l;i<=pos1;i++)
{
ans+=((a[i]*lazy2[ps1])+lazy1[ps1])%p;
ans%=p;
}
for(int i=pos2;i<=r;i++)
{
ans+=((a[i]*lazy2[ps2])+lazy1[ps2])%p;
ans%=p;
}
for(int i=bl[l]+1;i<=bl[r]-1;i++)
{
ans+=((sum[i]*lazy2[i])+lazy1[i]*(R[i]-L[i]+1))%p;
ans%=p;
}
}
}
int main()
{
scanf("%d%d",&n,&p);
int len=sqrt(n);
L[1]=1;
int last=1;;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
bl[i]=(i-1)/len+1;
if(last!=bl[i])
{
L[bl[i]]=i;
R[bl[i]-1]=i-1;
}
sum[bl[i]]+=a[i];
last=bl[i];
}
R[bl[n]]=n;
int t,g,c,opt;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
cin>>opt;
if(opt==1)
{
scanf("%d%d%d",&t,&g,&c);
cheng(t,g,c);
}
if(opt==2)
{
scanf("%d%d%d",&t,&g,&c);
add(t,g,c);
}
if(opt==3)
{
scanf("%d%d",&t,&g);
printf("%d\n",ask(t,g)%p);
}
}
return 0;
}