记录编号 333807 评测结果 AAAAAAAAAA
题目名称 [HAOI 2013]软件安装 最终得分 100
用户昵称 GravatarNewBee 是否通过 通过
代码语言 C++ 运行时间 0.288 s
提交时间 2016-10-31 15:19:06 内存使用 2.83 MiB
显示代码纯文本
#include<cstdio>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("haoi13t4.in","r",stdin);freopen("haoi13t4.out","w",stdout);chul();Cu;
using namespace std;
const int maxn=50010;
int n,pre[maxn<<2],nex[maxn<<2],minl,tot[maxn<<2],s,t;
bool roo[maxn<<2];
short lazy[maxn<<2];
int min(int x,int y){
	if(x>y)return y;
	return x;
}
int max(int x,int y){
	if(x>y)return x;
	return y;
}
void build(int rt,int l,int r){
	if(l==r){
		lazy[rt]=roo[rt]=0;
		pre[rt]=nex[rt]=tot[rt]=1;
		return;
	}
	int mid=(l+r)>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	pre[rt]=nex[rt]=tot[rt]=r-l+1;
}	
void update(int rt,int l,int mid,int r){
	if(lazy[rt]==0)return;
	int k=lazy[rt];
	lazy[rt]=0;
	if(k==1){
		roo[rt<<1]=1;
		lazy[rt<<1]=1;
		nex[rt<<1]=pre[rt<<1]=tot[rt<<1]=0;
		roo[rt<<1|1]=1;
		lazy[rt<<1|1]=1;
		nex[rt<<1|1]=pre[rt<<1|1]=tot[rt<<1|1]=0;
	}
	else{
		roo[rt<<1]=0;
		lazy[rt<<1]=2;
		nex[rt<<1]=pre[rt<<1]=tot[rt<<1]=mid-l+1;
		roo[rt<<1|1]=0;
		lazy[rt<<1|1]=2;
		nex[rt<<1|1]=pre[rt<<1|1]=tot[rt<<1|1]=r-mid;
	}
}
void asks(int rt,int l,int r,int d,bool k){
	if(!roo[rt]&&r-l+1==d){
		roo[rt]=1;
		lazy[rt]=1;
		minl=min(minl,l);
		pre[rt]=nex[rt]=tot[rt]=0;
		return;
	}
	int mid=(l+r)>>1;
	update(rt,l,mid,r);
	if(k==0){
		if(tot[rt<<1]>=d)asks(rt<<1,l,mid,d,0);
		else if(nex[rt<<1]!=0&&nex[rt<<1]+pre[rt<<1|1]>=d){
			int mmm=d-nex[rt<<1];
			asks(rt<<1,l,mid,nex[rt<<1],1);
			asks(rt<<1|1,mid+1,r,mmm,0);
		}
		else asks(rt<<1|1,mid+1,r,d,0);
	}
	else{
		if(tot[rt<<1|1]>=d)asks(rt<<1|1,mid+1,r,d,1);
		else {
			int mmm=d-pre[rt<<1|1];
			asks(rt<<1|1,mid+1,r,pre[rt<<1|1],1);
			asks(rt<<1,l,mid,mmm,1);
		}
	}
	pre[rt]=pre[rt<<1];
	if(!roo[rt<<1])pre[rt]=max(pre[rt],pre[rt<<1|1]+tot[rt<<1]);
	nex[rt]=nex[rt<<1|1];
	if(!roo[rt<<1|1]){
		nex[rt]=max(nex[rt],nex[rt<<1]+tot[rt<<1|1]);
	}
	tot[rt]=max(nex[rt<<1]+pre[rt<<1|1],max(tot[rt<<1],tot[rt<<1|1]));
	roo[rt]=roo[rt<<1]|roo[rt<<1|1];
}
void inho(){
	int d;
	scanf("%d",&d);
	if(tot[1]<d){
		printf("0\n");
		return;
	}
	minl=n+1;
	asks(1,1,n,d,0);
	printf("%d\n",minl);
}
void outhot(int rt,int l,int r){
	if(s<=l&&t>=r){
		lazy[rt]=2;
		roo[rt]=0;
		pre[rt]=nex[rt]=tot[rt]=r-l+1;
		return;
	}
	int mid=(l+r)>>1;
	update(rt,l,mid,r);
	if(s<=mid)outhot(rt<<1,l,mid);
	if(t>mid)outhot(rt<<1|1,mid+1,r);
	pre[rt]=pre[rt<<1];
	if(!roo[rt<<1])pre[rt]=max(pre[rt],pre[rt<<1|1]+tot[rt<<1]);
	nex[rt]=nex[rt<<1|1];
	if(!roo[rt<<1|1]){
		nex[rt]=max(nex[rt],nex[rt<<1]+tot[rt<<1|1]);
	}
	tot[rt]=max(nex[rt<<1]+pre[rt<<1|1],max(tot[rt<<1],tot[rt<<1|1]));
	roo[rt]=roo[rt<<1]|roo[rt<<1|1];
}
void outho(){
	scanf("%d%d",&s,&t);
	t=s+t-1;
	outhot(1,1,n);
}
void chul(){
	int m;
	scanf("%d%d",&n,&m);
	build(1,1,n);
	int k;
	for(int i=1;i<=m;i++){
		scanf("%d",&k);
		if(k==1)inho();
		else outho();
	}
}
int main(){
	Begin;
	chul();
}