记录编号 297802 评测结果 AAAAAAAAAAEEEEEEEEEE
题目名称 [HZOI 2014] 天使的小纸条 最终得分 50
用户昵称 GravatarFoolMike 是否通过 未通过
代码语言 C++ 运行时间 6.880 s
提交时间 2016-08-18 19:26:45 内存使用 30.93 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=310;
int n,m,q,a[N][N];
struct Bit{
	int a[N][N];
	int q1[N],q2[N],s1,s2;
	inline void change(int x,int y,int add){
		s1=s2=0;
		for (;x<=n;x+=(x&(-x))) q1[++s1]=x;
		for (;y<=m;y+=(y&(-y))) q2[++s2]=y;
		for (int i=1;i<=s1;i++)
		for (int j=1;j<=s2;j++)
			a[q1[i]][q2[j]]+=add;
	}
	inline int sum(int x,int y){//求区间[(1,1),(x,y)]的和 
		int ans=0;s1=s2=0;
		for (;x;x-=(x&(-x))) q1[++s1]=x;
		for (;y;y-=(y&(-y))) q2[++s2]=y;
		for (int i=1;i<=s1;i++)
		for (int j=1;j<=s2;j++)
			ans+=a[q1[i]][q2[j]];
		return ans;
	}
	inline int sum(int x1,int x2,int y1,int y2){
		return sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1);
	}
}T[110];
int main()
{
	freopen("luvletter.in","r",stdin);
	freopen("luvletter.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++){
		scanf("%d",&a[i][j]);
		T[a[i][j]].change(i,j,1);
	}
	scanf("%d",&q);
	while (q--){
		int mark,x,y,x1,y1,c;
		scanf("%d",&mark);
		if (mark==1){
			scanf("%d%d%d",&x,&y,&c);
			T[a[x][y]].change(x,y,-1);
			T[a[x][y]=c].change(x,y,1);
		}
		else{
			scanf("%d%d%d%d%d",&x,&x1,&y,&y1,&c);
			printf("%d\n",T[c].sum(x,x1,y,y1));
		}
	}
	return 0;
}