记录编号 229821 评测结果 AAAAAAAAAA
题目名称 [BOI 2007] 摩基亚Mokia 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 4.605 s
提交时间 2016-02-20 19:46:45 内存使用 95.74 MiB
显示代码纯文本
//YMX
#include<cstdio>
#include<algorithm>
int EPX,c,n,t,t1,t2,ans[510000];
inline void in(int &X)
{
	for(X=getchar();X<48||X>57;X=getchar());
	X^=48;
	for(EPX=getchar();47<EPX&&EPX<58;EPX=getchar())
		X=(X<<1)+(X<<3)+(EPX^48);
}
struct event
{
	int x,y,w,id,t;
	bool flag;
}o[2100000],tmp[2100000];
inline bool comp(event a,event b)
{
	if(a.x==b.x&&a.y==b.y)
		return a.flag<b.flag;
	return a.x==b.x?a.y<b.y:a.x<b.x;
}
inline void add()
{
	int x1,y1,x2,y2;
	in(x1),in(y1),in(x2),in(y2),++ans[0];
	o[++t].id=ans[0];o[t].x=x1-1,o[t].y=y1-1,o[t].w= 1,o[t].flag=1,o[t].t=t;
	o[++t].id=ans[0];o[t].x=x1-1,o[t].y=  y2,o[t].w=-1,o[t].flag=1,o[t].t=t;
	o[++t].id=ans[0];o[t].x=  x2,o[t].y=y1-1,o[t].w=-1,o[t].flag=1,o[t].t=t;
	o[++t].id=ans[0];o[t].x=  x2,o[t].y=  y2,o[t].w= 1,o[t].flag=1,o[t].t=t;
}
int tree[2100000];
inline void ADD(int x,int w)
{
	while(x<=n)
	{
		tree[x]+=w;
		x+=x&(-x);
	}
}
inline int sum(int x)
{
	int end=0;
	while(x)
	{
		end+=tree[x];
		x-=x&(-x);
	}
	return end;
}
inline void CDQ(int l,int r)
{
	if(l==r)
		return;
	int mid=l+r>>1,l1=l,l2=mid+1;
	for(int i=l;i<=r;++i)
	{
		if(o[i].t<=mid&&!o[i].flag)
			ADD(o[i].y,o[i].w);
		else if(o[i].t>mid&&o[i].flag)
			ans[o[i].id]+=o[i].w*sum(o[i].y);
	}
	for(int i=l;i<=r;++i)
		if(o[i].t<=mid&&!o[i].flag)
			ADD(o[i].y,-o[i].w);//这是撤销操作!
	for(int i=l;i<=r;++i)
		if(o[i].t<=mid)
			tmp[l1++]=o[i];
		else
			tmp[l2++]=o[i];
	for(int i=l;i<=r;++i)
		o[i]=tmp[i];
	CDQ(l,mid);
	CDQ(mid+1,r);
}
int main()
{
	freopen("mokia.in","r",stdin);
	freopen("mokia.out","w",stdout);
	in(n),in(n),in(c);
	while(c!=3)
	{
		if(c==1)
		{
			++t;
			o[t].t=t;
			in(o[t].x),in(o[t].y),in(o[t].w);
		}
		else if(c==2)
			add();
		in(c);
	}
	std::sort(o+1,o+t+1,comp);
	CDQ(1,t);
	for(int i=1;i<=ans[0];++i)
		printf("%d\n",ans[i]);
	//while(1);
}