线段树模板
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
using namespace std;
ll n,m;ll a[1000001];ll tree[1000001];ll tag[1000001];
int tp;
void build(ll p,ll l,ll r)
{
if(l==r){tree[p]=a[l];return;}
ll mid=(l+r)/2;
build(2*p+1,l,mid);
build(2*p+2,mid+1,r);
tree[p]=tree[2*p+1]+tree[2*p+2];
}
void update(ll v,ll s,ll e,ll p,ll l,ll r)
{
if(l==r){tree[p]+=v;return;}
ll mid=(r+l)/2;
if(s<=mid)update(v,s,e,2*p+1,l,mid);
if(e>mid)update(v,s,e,2*p+2,mid+1,r);
tree[p]=tree[2*p+1]+tree[2*p+2];
}
ll query(ll s,ll e,ll node,ll l,ll r)
{
if(s<=l&&e>=r)return tree[node];
ll lc=2*node+1;
ll rc=2*node+2;
ll mid=(l+r)/2;
ll res=0;
if(s<=mid)res+=query(s,e,lc,l,mid);
if(e>mid)res+=query(s,e,rc,mid+1,r);
return res;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
build(0,0,n-1);
for(int i=0;i<m;i++)
{
cin>>tp;
ll x,y,k;
if(tp==1)
{
cin>>x>>y>>k;
update(k,x-1,y-1,0,0,n-1);
}
else
{
cin>>x>>y;
cout<<query(x-1,y-1,0,0,n-1)<<endl;
}
}
}
支持加和查询,无tag缓存优化