记录编号 464320 评测结果 AAAAAAAAAA
题目名称 [BOI 2007] 摩基亚Mokia 最终得分 100
用户昵称 GravatarHzoi_Mafia 是否通过 通过
代码语言 C++ 运行时间 1.307 s
提交时间 2017-10-25 16:46:47 内存使用 20.15 MiB
显示代码纯文本
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
inline int read(){
	int sum(0);char ch(getchar());
	for(;ch<'0'||ch>'9';ch=getchar());
	for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
	return sum;
}
int n,m,que,tr[2000005],ans[800005];
struct node{int x,y,val,que,id,opt;inline bool operator<(const node &b)const{if(x==b.x&&y==b.y)return opt<b.opt;return x==b.x?y<b.y:x<b.x;}}q[200005],tmp[200005];
inline void update(int pos,int x){for(;pos<=n;pos+=pos&-pos)tr[pos]+=x;}
inline int sum(int pos){int ret(0);for(;pos;pos-=pos&-pos)ret+=tr[pos];return ret;}
inline void add_query(){
	int a(read()),b(read()),c(read()),d(read());++que;
	q[++m].que=que;q[m].x=a-1;q[m].y=b-1;q[m].val=1;q[m].opt=1;
	q[++m].que=que;q[m].x=c;q[m].y=d;q[m].val=1;q[m].opt=1;
	q[++m].que=que;q[m].x=a-1;q[m].y=d;q[m].val=-1;q[m].opt=1;
	q[++m].que=que;q[m].x=c;q[m].y=b-1;q[m].val=-1;q[m].opt=1;
}
inline void CDQ(int l,int r){
	if(l==r)return;
	int mid((l+r)>>1),tp1(l),tp2(mid+1);
	for(int i=l;i<=r;++i){
		if(q[i].id<=mid&&!q[i].opt)update(q[i].y,q[i].val);
		if(q[i].id>mid&&q[i].opt)ans[q[i].que]+=q[i].val*sum(q[i].y);
	}
	for(int i=l;i<=r;++i)if(q[i].id<=mid&&!q[i].opt)update(q[i].y,-q[i].val);
	for(int i=l;i<=r;++i)if(q[i].id<=mid)tmp[tp1++]=q[i];else tmp[tp2++]=q[i];
	for(int i=l;i<=r;++i)q[i]=tmp[i];
	CDQ(l,mid);CDQ(mid+1,r);
}
int main(){
	freopen("mokia.in","r",stdin);freopen("mokia.out","w",stdout);
	n=read(),n=read();
	while(1){
		int op(read());
		if(op==1)++m,q[m].x=read(),q[m].y=read(),q[m].val=read();
		else if(op==2)add_query();
		else break;
	}
	for(int i=1;i<=m;++i)q[i].id=i;
	sort(q+1,q+m+1);CDQ(1,m);
	for(int i=1;i<=que;++i)printf("%d\n",ans[i]);
}