#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define il inline
const LL MAXN=111111;
struct node
{
LL l,r,v,add,mid;
};
LL input[MAXN];
struct segmentTree
{
node T[MAXN*4];
il void init(LL s,LL t,LL o)
{
T[o].l=s,T[o].r=t,T[o].mid=T[o].l+((T[o].r-T[o].l)>>1);
if(T[o].l==T[o].r) {T[o].v=input[T[o].l];return;}
init(s,T[o].mid,o<<1);init(T[o].mid+1,t,o<<1|1);
T[o].v=T[o<<1].v+T[o<<1|1].v;
}
il void update_P(LL s,LL t,LL o,LL k)
{
if(T[o].l==T[o].r){T[o].add+=k;return;}
if(s<=T[o].mid) update_P(s,t,o<<1,k);if(t>T[o].mid) update_P(s,t,o<<1|1,k);
T[o].add=T[o<<1].add+T[o<<1|1].add;
}
il LL query(LL s,LL t,LL o)
{
LL ans=0;
if(s<=T[o].l && T[o].r<=t) return T[o].v+T[o].add;
if(s<=T[o].mid) ans+=query(s,t,o<<1);if(T[o].mid<t) ans+=query(s,t,o<<1|1);
return ans;
}
}ST;
LL n,m,op,x,y,k;
int main()
{
// freopen("P3372_8.in","r",stdin);
// freopen("P3372_8.out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(LL i=1;i<=n;i++) cin>>input[i];
ST.init(1,n,1);
while(m--)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;ST.update_P(x,y,1,k);
}
else if(op==2)
{
cin>>x>>y;cout<<ST.query(x,y,1)<<endl;
}
}
return 0;
}
感觉像是query有问题......这部分自己瞎写的,因为各种教程看不懂(悲)
顺便问一下标记持久化是什么,怎么写......
谢谢各位神犇