#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int l[100005],r[100005];
int sum[100005];
int dx,sl;
int sy[100005];
int a[100005];
int la1[100005],la2[100005];
int n,m,p;
void build(){
dx=sqrt(n);
sl=n/dx;
if(n%dx) sl++;
for(int i=1;i<=sl;i++)
l[i]=(i-1)*dx+1,r[i]=i*dx;
r[sl]=n;
for(int i=1;i<=sl;i++)
for(int j=l[i];j<=r[i];j++)
sum[i]+=a[j];
for(int i=1;i<=n;i++)
sy[i]=(i-1)/dx+1;
return;
}
void add(int x,int y,int k){
if(sy[x]==sy[y]){
for(int i=x;i<=y;i++)
a[i]+=k;
sum[sy[x]]+=(y-x+1)*k;
}
else{
for(int i=x;i<=r[sy[x]];i++)
a[i]+=k;
sum[sy[x]]+=(r[sy[x]]-x+1)*k;
for(int i=sy[x]+1;i<=sy[y]-1;i++)
la1[i]+=k,sum[i]+=(r[i]-l[i]+1)*k;
for(int i=l[sy[y]];i<=y;i++)
a[i]+=k;
sum[sy[y]]+=(y-l[sy[y]]+1)*k;
}
return;
}
void mul(int x,int y,int k){
if(sy[x]==sy[y]){
int num=0,nu2=0;
for(int i=x;i<=y;i++)
num=(num+a[i]),a[i]=a[i]*k,nu2=(nu2+a[i]);
sum[sy[x]]=(sum[sy[x]]+(nu2-num));
}
else{
int num=0,nu2=0;
for(int i=x;i<=r[sy[x]];i++)
num=(num+a[i]),a[i]=a[i]*k,nu2=(nu2+a[i]);
sum[sy[x]]=(sum[sy[x]]+(nu2-num));
for(int i=sy[x]+1;i<=sy[y]-1;i++)
la2[i]+=k,la1[i]=la1[i]*k,sum[i]=sum[i]*k;
num=0,nu2=0;
for(int i=l[sy[y]];i<=y;i++)
num=(num+a[i]),a[i]=a[i]*k,nu2=(nu2+a[i]);
sum[sy[y]]=(sum[sy[y]]+(nu2-num));
}
return;
}
int anwer(int x,int y){
int ans=0;
if(sy[x]==sy[y]){
for(int i=x;i<=y;i++)
ans=ans+a[i];
ans=ans*la2[sy[x]]+(y-x+1)*la1[sy[x]];
}
else{
for(int i=x;i<=r[sy[x]];i++)
ans=ans+a[i];
ans=ans*la2[sy[x]]+(r[sy[x]]-x+1)*la1[sy[x]];
for(int i=sy[x]+1;i<=sy[y]-1;i++)
ans=(ans+sum[i]);
int num=0;
for(int i=l[sy[y]];i<=y;i++)
num+=a[i];
ans=ans+(y-l[sy[y]]+1)*la1[sy[y]]+num*la2[sy[y]];
}
return ans;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=1;i<=n;i++)
la2[i]=1;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build();
int ch;
for(int i=1;i<=m;i++){
scanf("%lld",&ch);
int x,y,k;
if(ch==1){
scanf("%d%d%d",&x,&y,&k);
mul(x,y,k);
}
if(ch==2){
scanf("%lld%lld%lld",&x,&y,&k);
add(x,y,k);
}
if(ch==3){
scanf("%lld%lld",&x,&y);
printf("%lld\n",anwer(x,y));
}
}
return 0;
}
附上第一个数据:
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
题目样例正确,但是全WA
第一个数据的第一个输出正确,第二个却错误。
加上昨晚已经四个小时了,求大佬帮帮吧