记录编号 |
161950 |
评测结果 |
AAAAAAAAAAWWWWWWWWWW |
题目名称 |
[HZOI 2014] 天使的小纸条 |
最终得分 |
50 |
用户昵称 |
0 |
是否通过 |
未通过 |
代码语言 |
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;
}