省选专练之数据结构JSOI2009计数问题

低级的二维树状数组好伐

但是有分层图的思想在里面

#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';
		}
	}
}

猜你喜欢

转载自blog.csdn.net/fcb_x/article/details/80592032