记录编号 457249 评测结果 AAAAAAAAAA
题目名称 [BOI 2007] 摩基亚Mokia 最终得分 100
用户昵称 GravatarHzoi_Ivan 是否通过 通过
代码语言 C++ 运行时间 1.681 s
提交时间 2017-10-07 11:18:01 内存使用 18.11 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 205000
using namespace std;
int num,ans[N],n,m;
struct data{
	int x,y,val,pos,opt,id;//opt 0:修改 1:查询  
}d[N],tmp[N];
bool cmp(data a,data b){
	if(a.x==b.x&&a.y==b.y)return a.opt<b.opt;
	return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
}
void pre_work(){
	int x1,x2,y1,y2;
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);++num;
	d[++m].pos=num;d[m].x=x1-1;d[m].y=y1-1;d[m].val=1;d[m].opt=1;
	d[++m].pos=num;d[m].x=x2;d[m].y=y2;d[m].val=1;d[m].opt=1; 
	d[++m].pos=num;d[m].x=x2;d[m].y=y1-1;d[m].val=-1;d[m].opt=1; 
	d[++m].pos=num;d[m].x=x1-1;d[m].y=y2;d[m].val=-1;d[m].opt=1; 
	return;
}

int c[2000050];
void add(int x,int y){
	for(;x<=n;x+=(x&-x))c[x]+=y;
}
int query(int x){
	int cnt=0;
	for(;x;x-=(x&-x))cnt+=c[x];
	return cnt;
}

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(d[i].id<=mid&&d[i].opt==0){
			add(d[i].y,d[i].val);
			//printf("%d  %d  %d\n",d[i].y,d[i].val,query(d[i].y));
		}
		if(d[i].id>mid&&d[i].opt==1){
			ans[d[i].pos]+=d[i].val*query(d[i].y);
			//printf("%d  %d\n",d[i].pos,ans[d[i].pos]);
		}
	}
	for(int i=l;i<=r;i++)if(d[i].id<=mid&&d[i].opt==0)add(d[i].y,-d[i].val);
	for(int i=l;i<=r;i++){
		if(d[i].id<=mid)tmp[l1++]=d[i];
		else tmp[l2++]=d[i];
	}
	for(int i=l;i<=r;i++)d[i]=tmp[i];
	CDQ(l,mid); CDQ(mid+1,r);
	return ; 
}
int main(){
	freopen("mokia.in","r",stdin);
	freopen("mokia.out","w",stdout);
	int opt;
	scanf("%d%d",&opt,&n);
	while(1){
		scanf("%d",&opt);
		if(opt==1){m++;scanf("%d%d%d",&d[m].x,&d[m].y,&d[m].val);}
		if(opt==2){pre_work();}
		if(opt==3)break;
	}
	for(int i=1;i<=m;i++)d[i].id=i;
	//for(int i=1;i<=m;i++)
		//printf("%d  %d  %d  %d  %d  %d  %d\n",i,d[i].id,d[i].x,d[i].y,d[i].opt,d[i].val,d[i].pos);
	sort(d+1,d+m+1,cmp);
	//for(int i=1;i<=m;i++)
		//printf("%d  %d  %d  %d  %d  %d  %d\n",i,d[i].id,d[i].x,d[i].y,d[i].opt,d[i].val,d[i].pos);
	CDQ(1,m);
	for(int i=1;i<=num;i++)
		printf("%d\n",ans[i]);
	return 0;
}
/*
0 4 
1 2 3 3 
2 1 1 3 3 
1 2 2 2 
2 2 2 3 4 
3
*/