树状数组(模板)
lowbit:二进制最低位1的大小,也是其能管辖到的数的范围 树状数组记得开long long 单次操作的时间复杂度是O(lgn) 只需开N的空间 比线段树的常数小 按值建树( add(a[i],1) ):ask可以求比当前数小(或大)的数的数量 按位置建树( add(pos,1) ):ask可以求当前点左(或右)边的点数 树状数组:求前面或后面有多少个数 求某区间特定性质点的数量 可用于单点修改,区间查询 区间修改,单点查询等等
//
#include<bits/stdc++.h> using namespace std; #define low(x) x&(-x) #define ll long long int const N=5e5+7; int n,m; ll a[N]; //tr[N] //树状数组 void add(int pos,int val){ //维护其前缀和的操作 for(;pos<=n;pos+=low(pos)){ //记住就好 a[pos]+=val; } } ll ask(int x){ //查询x的前缀和 ll z=0; for(;x;x-=low(x)){ //记住就好 z+=a[x]; } return z; } int main(){ cin >> n >> m; for(int i=1;i<=n;++i){ int b; cin >> b; add(i,b); } while(m--){ int b,c,d; cin >> b >> c >> d; if(b==1) add(c,d); else cout << ask(d)-ask(c-1) << endl; } return 0; }