随便翻一道题目,然后是二维树状数组
实际上和普通的树状数组也是差不多的
也是对两维进行lowbit然后操作
求某一个矩形容斥一下就行了
#include<bits/stdc++.h>
#define maxn 310
#define maxc 110
using namespace std;
int n,q,m,co[maxn][maxn];
int lowbit(int v) {return v&(-v);}
struct tr{
int tree[maxn][maxn];
void add(int x,int y,int num)
{
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=m;j+=lowbit(j))
tree[i][j]+=num;
}
int query(int x,int y)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
res+=tree[i][j];
return res;
}
}a[maxc];
int main()
{
scanf("%d%d",&n,&m);
int c;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&co[i][j]),a[co[i][j]].add(i,j,1);
scanf("%d",&q);
for(int i=1;i<=q;++i){
int opt,x,y,c,xx,yy;
scanf("%d",&opt);
if(opt==1){
scanf("%d%d%d",&x,&y,&c);
a[co[x][y]].add(x,y,-1);
co[x][y]=c;
a[co[x][y]].add(x,y,1);
}
if(opt==2){
scanf("%d%d%d%d%d",&x,&xx,&y,&yy,&c);
int ans1=a[c].query(xx,yy);
int ans2=a[c].query(xx,y-1);
int ans3=a[c].query(x-1,yy);
int ans4=a[c].query(x-1,y-1);
printf("%d\n",ans1-ans2-ans3+ans4);
}
}
return 0;
}