Luogu P4054 [JSOI2009]计数问题(二维树状数组)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,m,q,tree[105][305][305],color[305][305];

inline int lowbit(int x){return x&(-x);}

inline void add(int color,int x,int y,int add){
	for(int i=x;i<=n;i+=lowbit(i)){
		for(int j=y;j<=m;j+=lowbit(j)){
			tree[color][i][j]+=add;
		}
	}
}

inline int query(int color,int x,int y){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)){
		for(int j=y;j;j-=lowbit(j)){
			ans+=tree[color][i][j];
		}
	}
	return ans;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&color[i][j]);
			add(color[i][j],i,j,1);
		}
	}
	scanf("%d",&q);
	while(q--){
		int opt;
		scanf("%d",&opt);
		if(opt==1){
			int x,y,c;
			scanf("%d%d%d",&x,&y,&c);
			add(color[x][y],x,y,-1);
			color[x][y]=c;
			add(color[x][y],x,y,1);
		}
		else if(opt==2){
			int x1,x2,y1,y2,c;
			scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c);
			printf("%d\n",query(c,x2,y2)-query(c,x2,y1-1)-query(c,x1-1,y2)+query(c,x1-1,y1-1));
			//注意x1,y1要减一 
		}
	}
}
posted @ 2019-08-08 08:26  Y15BeTa  阅读(123)  评论(0编辑  收藏  举报