树状数组模板
一维树状数组模板(以求和为例)
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int tree[maxn],n;
#define lowbit(x) ((x)&-(x))
void add(int x,int d){ //更新树状数组
while(x<=n){
tree[x]+=d;
x+=lowbit(x);
}
}
int sum(int x){ //求和区间1 to x;
int sum=0;
while(x>0){
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
int main(void){
//...
return 0;
}
二维树状数组模板(以求和为例)
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+10;
int tree[maxn][maxn],n;
#define lowbit(x) ((x)&-(x))
void add(int x,int y,int a){ //更新树状数组
int x1=x;
while(y<=n){
x=x1;
while(x<=n){
tree[y][x]+=a;
x+=lowbit(x);
}
y+=lowbit(y);
}
}
int sum(int x,int y){ //求和(1,1)到 (y,x)的矩阵
int sum=0,x1=x;
while(y>0){
x=x1;
while(x>0){
sum+=tree[y][x];
x-=lowbit(x);
}
y-=lowbit(y);
}
return sum;
}
int main(void){
//...
return 0;
}