#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
int a[maxn];
struct node{
long long sum;
long long lazy=0;
};
node tree[4*maxn];
void build(int l,int r,int now)
{
if(l==r){
tree[now].sum=a[l];
return;
}
int mid=(l+r)/2;
build(l,mid,now*2);
build(mid+1,r,now*2+1);
tree[now].sum=tree[2*now].sum+tree[2*now+1].sum;
}
void update(int L,int R,int l,int r,int now,int k)
{
if(L==l&&R==r){
tree[now].sum+=k*(r-l+1);
tree[now*2].lazy+=k;
tree[now*2+1].lazy+=k;
return;
}
int mid=(l+r)/2;
if(L>mid)
update(L,R,mid+1,r,now*2+1,k);
else if(R<=mid)
update(L,R,l,mid,now*2,k);
else{
update(L,mid,l,mid,now*2,k);
update(mid+1,R,mid+1,r,now*2+1,k);
}
tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
}
int query(int L,int R,int l,int r,int now)
{
if(tree[now].lazy!=0){
tree[now].sum+=tree[now].lazy*(r-l+1);
tree[now*2].lazy+=tree[now].lazy;
tree[now*2+1].lazy+=tree[now].lazy;
tree[now].lazy=0;
}
if(L==l&&R==r)
return tree[now].sum;
int mid=(l+r)/2;
if(R<=mid)
query(L,R,l,mid,now*2);
else if(L>mid)
query(L,R,mid+1,r,now*2+1);
else{
int a,b;
a=query(L,mid,l,mid,now*2);
b=query(mid+1,R,mid+1,r,now*2+1);
return a+b;
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
int cz,x,y,k,Sum;
for(int i=0;i<m;i++){
scanf("%d",&cz);
if(cz==1){
scanf("%d%d%d",&x,&y,&k);
update(x,y,1,n,1,k);
}
else{
scanf("%d%d",&x,&y);
Sum=query(x,y,1,n,1);
printf("%d\n",Sum);
}
}
return 0;
}
}
测试样例全过,但是提交上去只有第一组数据过了,最后三组数据还超时。。。 个人猜想:wa是不是因为我懒标签下滤早了?超时。。。暂时没有想到原因。 求大佬帮助,万分感谢[鞠躬]!