记录编号 161950 评测结果 AAAAAAAAAAWWWWWWWWWW
题目名称 [HZOI 2014] 天使的小纸条 最终得分 50
用户昵称 Gravatar0 是否通过 未通过
代码语言 C++ 运行时间 6.618 s
提交时间 2015-05-12 12:15:54 内存使用 35.56 MiB
显示代码纯文本
#include<cstdio>
#include<map>

using namespace std;

map <int,int> sbfz;

int n,m,a[301][301],c[301][301][101];
int kind=0;

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

int abs(int x)
{
	if(x>0)
	    return x;
	return -x;
}

void change(int i,int j,int w)
{
	int y=j;
	int z=a[i][j];
	a[i][j]=w;
	for(i;i<=n;i+=lowbit(i))
	    for(j=y;j<=m;j+=lowbit(j))
	    {
			c[i][j][z]--;
			c[i][j][w]++;
	    }

}

int out(int i,int j,int w)
{
	int ans=0;
	int y=j;
	for(i;i>0;i-=lowbit(i))
		for(j=y;j>0;j-=lowbit(j))
		{
			ans+=c[i][j][w];
		}
	return ans;

}

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

int main()
{
	freopen("luvletter.in","r",stdin);
	freopen("luvletter.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		int x;
		for(int j=1;j<=m;j++)
		{

			scanf("%d",&x);
			if(sbfz[x]==0)
			{
				kind++;
				sbfz[x]=kind;
			}
			a[i][j]=sbfz[x];
			add(i,j,sbfz[x]);
		}
	}
	int s;
	scanf("%d",&s);
	for(int i=1;i<=s;i++)
	{
		int c,x1,x2,y1,y2,w;

		scanf("%d",&c);
		if(c==1)
	    {
			scanf("%d%d%d",&x1,&y1,&w);
			if(sbfz[w]==0)
			{
				kind++;
				sbfz[w]=kind;
			}
			change(x1,y1,sbfz[w]);
		}
		else
		{
			scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&w);
			if(sbfz[w]==0)
			{
				kind++;
				sbfz[w]=kind;
			}
			w=sbfz[w];
			printf("%d\n",out(x2,y2,w)-out(x1-1,y2,w)-out(x2,y1-1,w)+out(x1-1,y1-1,w));
		}
	}
	return 0;
}