低级的二维树状数组好伐
但是有分层图的思想在里面
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
inline void read(int &x){
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
const int N=301;
int T[101][N][N]={};
inline int lowbit(int x){
return x&(-x);
}
void update(int x,int y,int col,int val){
for(int i=x;i<N;i+=lowbit(i)){
for(int j=y;j<N;j+=lowbit(j)){
T[col][i][j]+=val;
}
}
}
int query(int val,int x,int y){
int ret=0;
for(int i=x;i;i-=lowbit(i)){
for(int j=y;j;j-=lowbit(j)){
ret+=T[val][i][j];
}
}
return ret;
}
int n,m;
int a[N][N]={};
int main(){
// freopen("3605.txt","r",stdin);
read(n);
read(m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
read(a[i][j]);
update(i,j,a[i][j],1);
}
}
// cout<<query(1,0,3)<<'\n';
int Q;
read(Q);
while(Q--){
int opt;
read(opt);
if(opt==1){
int x,y,c;
read(x);
read(y);
read(c);
update(x,y,a[x][y],-1);
a[x][y]=c;
update(x,y,a[x][y],1);
}
else{
int x1,x2,y1,y2;
int c;
read(x2);
read(x1);
read(y2);
read(y1);
read(c);
int ans=query(c,x1,y1);
ans-=query(c,x2-1,y1);
ans-=query(c,x1,y2-1);
ans+=query(c,x2-1,y2-1);
cout<<ans<<'\n';
}
}
}