/*
二维树状数组(2D Binary Index Tree)
*/
struct BIT_2D
{
static const int N=1e3+5;
int t[N][N];
//查询前缀和
int query(int x,int y){
int ans=0;
for(;x;x-=(x&-x)){
for(;y;y-=(y&-y)){
ans+=t[x][y];
}
}
return ans;
}
//单点修改
void add(int x,int y,int val){
for(;x<=N;x+=(x&-x)){
for(;y<=N;y+=(y&-y)){
t[x][y]+=val;
}
}
}
//区间修改(差分思想)
/*
原始数组 a[i][j]
差分数组 d[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]
树状数组 t[i][j]记录差分数组的前缀和
*/
void update(int x1,int y1,int x2,int y2,int val){
add(x1,y1,val);
add(x1,y2+1,-val);
add(x2+1,y1,-val);
add(x2+1,y2+1,val);
}
};