权值的种类只有100种,对每种开个二维BIT,然后是经典操作。
#include<cstdio>
using namespace std;
int n,m,q,x1,y1,x2,y2,val,op,a[][];
struct BIT_2D
{
int d[][];
void update(int x,const int &y,const int &V)
{
for(;x<=n;x+=(x&(-x)))
for(int j=y;j<=n;j+=(j&(-j)))
d[x][j]+=V;
}
int getsum(int x,const int &y)
{
int res=;
for(;x;x-=(x&(-x)))
for(int j=y;j;j-=(j&(-j)))
res+=d[x][j];
return res;
}
}T[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
{
scanf("%d",&a[i][j]);
T[a[i][j]].update(i,j,);
} scanf("%d",&q);
for(;q>;--q)
{
scanf("%d",&op);
if(op==)
{
scanf("%d%d%d",&x1,&y1,&val);
T[a[x1][y1]].update(x1,y1,-);
T[a[x1][y1]=val].update(x1,y1,);
}
else
{
scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&val);
int t1=T[val].getsum(x2,y2);
int t2=T[val].getsum(x1-,y2);
int t3=T[val].getsum(x2,y1-);
int t4=T[val].getsum(x1-,y1-);
printf("%d\n",t1-t2-t3+t4);
}
}
return ;
}