二维树状数组,对于每个颜色开一个树状数组,用容斥求解。
code:
#include <cstdio> using namespace std; int read() { char c;while(c=getchar(),c<'0'||c>'9'); int x=c-'0';while(c=getchar(),c>='0'&&c<='9')x=x*10+c-'0'; return x; } int N,M,tr[101][301][301],a[301][301]; void add(int x,int y,int c,int p) { for(int i=x;i<=N;i+=i&-i) for(int j=y;j<=M;j+=j&-j) tr[c][i][j]+=p; return ; } int get(int x,int y,int c) { int ans=0; for(int i=x;i;i-=i&-i) for(int j=y;j;j-=j&-j) ans+=tr[c][i][j]; return ans; } int main() { N=read(),M=read(); for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) add(i,j,a[i][j]=read(),1); int Q=read(); while(Q--){ int o=read(); if(o==1){ int x=read(),y=read(),c=read(); add(x,y,a[x][y],-1); add(x,y,a[x][y]=c,1); } else{ int x=read(),fx=read(),y=read(),fy=read(),c=read(); printf("%d ",get(fx,fy,c)-get(x-1,fy,c)-get(fx,y-1,c)+get(x-1,y-1,c)); } } }