BZOJ 1452 Count 【模板】二维树状数组

时间:2023-03-08 22:16:10

BZOJ 1452 Count 【模板】二维树状数组

对每种颜色开一个二维树状数组

 #include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
int t[][maxn][maxn],c[maxn][maxn],Q,n,m,k,x,y,xx,yy,col;
inline void read(int &k){
k=; int f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
k*=f;
}
inline void add(int col,int x,int y,int del){
for(int i=y;i<=n;i+=i&-i)
for(int j=x;j<=m;j+=j&-j) t[col][i][j]+=del;
}
inline int query(int col,int x,int y){
int ret=;
for(int i=y;i;i-=i&-i)
for(int j=x;j;j-=j&-j) ret+=t[col][i][j];
return ret;
}
int main(){
read(n); read(m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) read(x),c[i][j]=x,add(x,i,j,);
read(Q);
while(Q--){
read(k);
if(k==){
read(x); read(y); read(col);
add(c[x][y],x,y,-); add(col,x,y,); c[x][y]=col;
}
else{
read(x); read(xx); read(y); read(yy); read(col);
printf("%d\n",query(col,xx,yy)-query(col,x-,yy)-query(col,xx,y-)+query(col,x-,y-));
}
}
return ;
}