记录编号 60599 评测结果 AAAAAAAAAA
题目名称 贪婪大陆 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.475 s
提交时间 2013-05-27 14:27:23 内存使用 7.94 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<map>
#include<set>
#include<vector>
#include<cstring>
#include<queue>
#include<deque>
#include<algorithm>
#include<cmath>
using namespace std;
const int SIZEL=200001;
int n,m;
class SEGMENT{
public:
	int l,r;
	int lchild,rchild;
	int sum;//区间和
};
SEGMENT ls[SIZEL],rs[SIZEL];//布雷区间的左,右端点数区间和
#define now s[root]
int tot;
void build(SEGMENT s[SIZEL],int root,int x,int y){
	#define onit s[root]
	onit.l=x,onit.r=y;
	onit.sum=0;
	if(y>x){
		int mid=(x+y)>>1;
		onit.lchild=++tot;
		build(s,tot,x,mid);
		onit.rchild=++tot;
		build(s,tot,mid+1,y);
	}
	else{
		onit.lchild=-1;
		onit.rchild=-1;
	}
}
int getsum(SEGMENT s[SIZEL],int root,int x,int y){
	if(root==-1||now.r<x||now.l>y) return 0;
	if(now.l>=x&&now.r<=y) return now.sum;
	return getsum(s,now.lchild,x,y)+getsum(s,now.rchild,x,y);
}
void add(SEGMENT s[SIZEL],int root,int x){//a[x]++
	if(root==-1||now.r<x||now.l>x) return;
	now.sum++;
	add(s,now.lchild,x);
	add(s,now.rchild,x);
}
void init(void){
	scanf("%d%d",&n,&m);
	tot=0;
	build(ls,0,1,n);
	tot=0;
	build(rs,0,1,n);
}
void work(void){
	int count=0;
	int i;
	int op,lnow,rnow,temp;
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&op,&lnow,&rnow);
		if(op==1){//布雷
			count++;
			add(ls,0,lnow);
			add(rs,0,rnow);
		}
		else{//询问
			temp=getsum(rs,0,1,lnow-1)+getsum(ls,0,rnow+1,n);
			printf("%d\n",count-temp);
		}
	}
}
int main(){
	freopen("greedisland.in","r",stdin);
	freopen("greedisland.out","w",stdout);
	init();
	work();
	return 0;
}