classBinaryIndexedTree{public:int N;
vector<int> a;BinaryIndexedTree(int n){
N = n;
a =vector<int>(N +1);}inlineintlowbit(int x){return x &-x;}voidadd(int loc,int val){// li[loc]+=val;for(; loc <= N; loc +=lowbit(loc))
a[loc]+= val;}intquery(int loc){// sum{li[k] | 1<=k<=loc}int res =0;for(; loc >0; loc -=lowbit(loc))
res += a[loc];return res;}};
版本2: 支持单点更新+查询前缀极值
classBinaryIndexedTree{public:int N;
vector<int> a;BinaryIndexedTree(int n){
N = n;
a =vector<int>(N +1);}inlineintlowbit(int x){return x &-x;}voidupdate(int loc,int val){// li[loc]=max(li[loc], val);for(; loc < N; loc +=lowbit(loc))
a[loc]=max(a[loc], val);}intquery(int loc){// max{li[k] | 1<=k<=loc}int res = INT32_MIN;for(; loc >0; loc -=lowbit(loc))
res =max(res, a[loc]);return res;}};