#include<bits/stdc++.h>
#define MAXN 500000 + 10
#define ll long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
using namespace std;
struct node{
ll l,r,sum,tag;
}tree[MAXN<<2];
ll n,m,ans;
int opt,x,y;
inline ll read() {
ll r=0;bool flag=true;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') flag=false;ch=getchar();}
while(ch>='0'&&ch<='9'){r=(r<<3)+(r<<1)+(ch^48);ch=getchar();}
return flag==true?r:~r+1;
}
inline void write(ll x) {
char ch[40];int len=0;
if(x<0){putchar(45);x=~x+1;}
do{ch[len++]=x%10+48;x/=10;}while(x>0);
for(int i=len-1;i>=0;i--) putchar(ch[i]);
putchar('\n');
}
inline void pushup(ll x) {
tree[x].sum=tree[ls(x)].sum+tree[rs(x)].sum;
}
inline void pushdown(ll x) {
if(tree[x].tag) {
ll p=tree[x].tag;
tree[x].tag=0;
tree[ls(x)].tag+=p;
tree[rs(x)].tag+=p;
tree[ls(x)].sum+=(tree[ls(x)].r-tree[ls(x)].l+1)*p;
tree[rs(x)].sum+=(tree[rs(x)].r-tree[rs(x)].l+1)*p;
}
}
inline void build(ll l,ll r,ll x) {
tree[x].l=l;
tree[r].r=r;
if(l==r) {
tree[x].sum=read();
return;
}
ll mid=(l+r)>>1;
build(l,mid,ls(x));
build(mid+1,r,rs(x));
pushup(x);
}
inline void query(ll l,ll r,ll x) {
if(l<=tree[x].l&&tree[x].r<=r) {
ans+=tree[x].sum;
return;
}
pushdown(x);
ll mid=(tree[x].l+tree[x].r)>>1;
if(mid>=l) query(l,r,ls(x));
if(mid<r) query(l,r,rs(x));
}
inline void change(ll l,ll r,ll x,ll v) {
if(l<=tree[x].l&&tree[x].r<=r) {
tree[x].sum+=(tree[x].r-tree[x].l+1)*v;
tree[x].tag+=v;
return;
}
pushdown(x);
ll mid=(tree[x].l+tree[x].r)>>1;
if(mid>=l) change(l,r,ls(x),v);
if(mid<r) change(l,r,rs(x),v);
pushup(x);
}
int main(void) {
cin>>n>>m;
build(1,n,1);
while(m--) {
opt=read();x=read();y=read();
if(opt==1) {
ll k;k=read();
change(x,y,1,k);
}
else {
ans=0;
query(x,y,1);
write(ans);
}
}
return 0;
}
原题 P3312
想温习一下线段树,却WA掉了,找了两小时也没查出来错,求大佬帮忙(^_^)qwq。