【模板】树状数组2

题目

  • 基本介绍
  • 模板题目
  • 代码实现

基本介绍

这篇是树状数组模板2 主要内容有:
1.将某区间每一个数数加上x
2.求出某一个数的和
也就是说支持区间修改

我们可以看一下 Qi.DC 的想法 他说:“
我们在树状数组中可以用前 i 项的和来表示第 i 个数 那么当对 x ~ y 的区间进行修改的时候需要在树状数组中的第 x 个位置 + k 第 y + 1 个位置 -k 这样便维护了这个树状数组 输出时候直接输出查询即可”
这也就完成了区间修改

模板题目

见基本介绍

代码实现

Qi.DC的思路



#include<iostream>
#include<cstdio>
#include<cctype>

    using namespace std;
    #define in = read()
    typedef long long ll;
    const ll size = 500000 + 1000;

        #define lowbit(x) (x & -x)

            ll n,m;
            ll tree[size];
            ll last,next;

inline ll read(){
        ll num = 0 , f = 1;   char ch = getchar();

        while(!isdigit(ch)){
                if(ch == '-')   f = -1;
                ch = getchar();
        }

        while(isdigit(ch)){
                num = num*10 + ch - '0';
                ch = getchar();
        }

        return num*f;
}

inline void add(ll x,ll y){
        while(x <= n){
                tree[x] += y;
                x += lowbit(x);
        }
}

inline ll query(ll x){
        ll ans = 0;
        while(x){
                ans += tree[x];
                x -= lowbit(x);
        }
        return ans;
}

int main(){
        n in;   m in;
        for(int i=1;i<=n;i++){
                ll now;     now in;
                add(i,now - last);
                last = now;
        }

        while(m --){
                ll que;     que in;
                if(que == 1){
                        ll x,y,z;
                        x in;   y in;   z in;
                        add(x,z);
                        add(y + 1,-z);
                }
                else if(que == 2){
                        ll x;
                        x in;
                        printf("%d\n",query(x));
                }
        }
}


//COYG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值