
有点莫名其妙。不知道有没有低级错误
#include<bits/stdc++.h>
#define int long long
#define maxn 100010
using namespace std;
int t,n,q,a[maxn],tr[maxn<<2],ts[maxn<<2],tag1[maxn<<2],tag2[maxn<<2];
inline int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
return ret*f;
}
void push_down(int now,int l,int r){
if(l==r){
tag1[now]=tag2[now]=0;
return;
}
int lson=now<<1,rson=(now<<1)|1,mid=(l+r)>>1;
if(tag1[now]){
tr[lson]=(mid-l+1)*tag1[now],tr[rson]=(r-mid)*tag1[now];
ts[lson]=tr[lson]*tag1[now],ts[rson]=tr[rson]*tag1[now];
tag1[now]=0;
}
ts[lson]+=tr[lson]*tag2[now]*2+(mid-l+1)*tag2[now]*tag2[now];
ts[rson]+=tr[rson]*tag2[now]*2+(r-mid)*tag2[now]*tag2[now];
tag2[now]=0;
}
void push_up(int now){
int lson=now<<1,rson=(now<<1)|1;
tr[now]=tr[lson]+tr[rson];
ts[now]=ts[lson]+ts[rson];
}
void Build(int now,int l,int r){
if(l==r){
tr[now]=a[l];
ts[now]=tr[now]*a[l];
tag1[now]=tag2[now]=0;
return;
}
int lson=now<<1,rson=(now<<1)|1,mid=(l+r)>>1;
Build(lson,l,mid),Build(rson,mid+1,r);
push_up(now);
}
void Update1(int x,int y,int k,int now,int l,int r){
if(x<=l&&r<=y){
tr[now]=(r-l+1)*k;
ts[now]=(r-l+1)*k*k;
tag1[now]=k;
tag2[now]=0;
return;
}
push_down(now,l,r);
int lson=now<<1,rson=(now<<1)|1,mid=(l+r)>>1;
if(x<=mid)Update1(x,y,k,lson,l,mid);
if(mid+1<=y)Update1(x,y,k,rson,mid+1,r);
push_up(now);
}
void Update2(int x,int y,int k,int now,int l,int r){
if(x<=l&&r<=y){
ts[now]+=tr[now]*k*2+(r-l+1)*k*k;
tr[now]+=(r-l+1)*k;
tag2[now]+=k;
return;
}
push_down(now,l,r);
int lson=now<<1,rson=(now<<1)|1,mid=(l+r)>>1;
if(x<=mid)Update2(x,y,k,lson,l,mid);
if(mid+1<=y)Update2(x,y,k,rson,mid+1,r);
push_up(now);
}
int Query(int x,int y,int now,int l,int r){
if(x<=l&&r<=y)return ts[now];
push_down(now,l,r);
int lson=now<<1,rson=(now<<1)|1,mid=(l+r)>>1,ret=0;
if(x<=mid)ret+=Query(x,y,lson,l,mid);
if(mid+1<=r)ret+=Query(x,y,rson,mid+1,r);
return ret;
}
signed main(){
t=read();
for(int c=1;c<=t;c++){
printf("Case %lld:\n",c);
n=read(),q=read();
for(int i=1;i<=n;i++)a[i]=read();
Build(1,1,n);
while(q--){
int op=read();
if(!op){
int st=read(),ed=read(),x=read();
Update1(st,ed,x,1,1,n);
}
if(op==1){
int st=read(),ed=read(),x=read();
Update2(st,ed,x,1,1,n);
}
if(op==2){
int st=read(),ed=read();
printf("%lld\n",Query(st,ed,1,1,n));
}
}
}
return 0;
}