Description

Input

Output

Sample Input

Sample Output
1
2
2
HINT
题目分析:
对于每个颜色 我们都开一个二维树状数组就好了
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int f[105][305][305];
int n,m;
int a[305][305];
void update(int x,int y,int color,int val)
{
for(int i=x;i<=n;i+=(i&-i))
for(int j=y;j<=m;j+=(j&-j))
f[color][i][j]+=val;
}
int ask(int x,int y,int color)
{
//if(x==0||y==0) return 0;
int sum=0;
for(int i=x;i;i-=(i&-i))
for(int j=y;j;j-=(j&-j))
sum+=f[color][i][j];
return sum;
}
int q;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
update(i,j,a[i][j],1);
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int tmp;
scanf("%d",&tmp);
if(tmp==1)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
update(x,y,a[x][y],-1);
a[x][y]=c;
update(x,y,a[x][y],1);
}
else
{
int dx1,dx2,dy1,dy2,c;
scanf("%d%d%d%d%d",&dx1,&dx2,&dy1,&dy2,&c);
int ans=0;
ans=ask(dx2,dy2,c)+ask(dx1-1,dy1-1,c);
ans-=ask(dx1-1,dy2,c);
ans-=ask(dx2,dy1-1,c);
printf("%d\n",ans);
}
}
}