pjfffb @ 2023-11-01 21:31:35
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
long long n,m,a[N],b,x,y,v;
long long res;
struct node{
long long l,r,w,f;
}tree[4*N+1];
void build(int k,int l,int r)
{
tree[k].l=l,tree[k].r=r;
if(tree[k].l==tree[k].r)
{
tree[k].w=a[l];
return;
}
int m=(l+r)/2;
build(k*2,l,m);
build(k*2+1,m+1,r);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
void down(int k){
tree[k*2].f+=tree[k].f;
tree[k*2+1].f+=tree[k].f;
tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);
tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);
tree[k].f=0;
}
void add(int k){
if(tree[k].l>y||tree[k].r<x) return;
if(tree[k].l>=x&&tree[k].r<=y){
tree[k].w+=(tree[k].r-tree[k].l+1)*v;
tree[k].f+=v;
return;
}
if(tree[k].f>0) down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) add(2*k);
if(y>mid) add(2*k+1);
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
int ask(int x,int y,int k)
{
if(tree[k].l>y||tree[k].r<x) return 0;
if(tree[k].l>=x&&tree[k].r<=y) return tree[k].w;
if(tree[k].f>0) down(k);
return (long long)ask(x,y,k*2)+ask(x,y,k*2+1);
}
int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
cin>>n,cin>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
cin>>b,cin>>x,cin>>y;
res=0;
if(b==1){
cin>>v;
add(1);
}
else printf("%lld\n",ask(x,y,1));
}
}
by Dawn_chen @ 2023-11-01 21:42:14
ask 函数定义为 long long
类型也可以
@pjfffb
by Dawn_chen @ 2023-11-01 21:43:24
不然的话 ask 函数还是会返回 int
类型
by pjfffb @ 2023-11-02 18:36:47
@Dawn_chen 可以了,谢谢大佬指点