树状数组模版+讲解-编程学习交流讨论版论坛-综合讨论-ZDZL

树状数组模版+讲解

“`
#include<bits/stdc++.h>
using namespace std;

int n,q;
int a[500010],tree[500010]; //tree[i] = a[i-lowbit(i)+1,i] 的和

int lowbit(int x){
    return x&-x;
}

 

void add(int x,int y){
    //找父亲操作,给每个父亲全部加上 y
    //i 的父亲是 i+lowbit(i),即让 i 进位
    for(;x<=n;x+=lowbit(x)){
      tree[x]+=y;
    }
}
//[1,x] 区间的和
long long ask(long long x){
    //从后往前累加
    long long sum=0;
    for(;x;x-=lowbit(x))sum+=tree[x];

    return sum;
}

void solve(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
      cin>>a[i];
      add(i,a[i]);
    }   

    while(q–){
      int op,l,r;
      cin>>op>>l>>r;
      if(op==1)add(l,r);
      else {
        cout<<ask(r)-ask(l-1)<<endl;
      }
    }
}
int main(){
    solve();
}
“`

    • wcqk的头像-ZDZLwcqk徽章-ZDZL创始伙伴-ZDZL等级-LV4-ZDZL作者超级版主0