线段树模板

#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缓存优化

posted @ 2025-04-08 21:41  邓佑孤  阅读(19)  评论(0)    收藏  举报