第一次写二维树状数组,表示成三维的矩阵,第三维自然是颜色种类,对每个颜色的二维平面维护出现的次数,求问的时候就方便多了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int NN = 310 , MM = 310;
int n,m,t,q;
int Map[NN][MM];
int Trep[NN][MM][101];
int lowbit(int x){
return x&(-x);
}
void update(int x,int y,int c,int v)
{
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=m;j+=lowbit(j))
Trep[i][j][c] += v;
}
int ask(int x,int y,int c)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
res+=Trep[i][j][c];
return res;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,z,op,f,xx,yy,c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&Map[i][j]);
update(i,j,Map[i][j],1);
}
scanf("%d",&q);
while(q--)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&x,&y,&c);
update(x,y,Map[x][y],-1);
Map[x][y]=c;
update(x,y,Map[x][y],+1);
}
else
{
scanf("%d%d%d%d%d",&x,&xx,&y,&yy,&c);
int ans;
ans=ask(xx,yy,c)+ask(x-1,y-1,c);
ans-=ask(x-1,yy,c);
ans-=ask(xx,y-1,c);//注意多加的一行一列最后要减去
printf("%d\n",ans);
}
}
return 0;
}
/*
3 3
1 2 3
3 2 1
2 1 3
3
2 1 2 1 2 1
1 2 3 2
2 2 3 2 3 2
*/