记录编号 333898 评测结果 AAAAAAAAAA
题目名称 [HAOI 2013]软件安装 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.908 s
提交时间 2016-10-31 16:22:38 内存使用 3.34 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50010;
void build(int,int,int);
void modify(int,int,int);
void query(int,int,int);
void pushdown(int,int,int,int);
void refresh(int,int,int,int);
int maxzero[maxn<<2],prefix[maxn<<2],suffix[maxn<<2],lazy[maxn<<2];
int n,m,pr,sm,x,s,t,d,ans;
int main(){
#define MINE
#ifdef MINE
	freopen("haoi13t4.in","r",stdin);
	freopen("haoi13t4.out","w",stdout);
#endif
	memset(lazy,-1,sizeof(lazy));
	scanf("%d%d",&n,&m);
	build(1,n,1);
	while(m--){
		scanf("%d",&d);
		if(d==1){
			scanf("%d",&x);
			if(maxzero[1]<x)printf("0\n");
			else{
				int L=x,R=n;
				while(L<=R){
					t=(L+R)>>1;
					//printf("L=%d R=%d M=%d\n",L,R,t);
					ans=pr=sm=0;
					query(1,n,1);//printf("ans=%d\n",ans);
					if(ans>=x)R=t-1;
					else L=t+1;
				}
				printf("%d\n",L-x+1);
				s=L-x+1;
				t=L;
				d=1;
				modify(1,n,1);
			}
		}
		else{
			scanf("%d%d",&s,&t);
			t+=s-1;
			d=0;
			modify(1,n,1);
		}
	}
#ifndef MINE
	printf("\n-------------------------DONE-------------------------\n");
	for(;;);
#else
	fclose(stdin);
	fclose(stdout);
#endif
	return 0;
}
void build(int l,int r,int rt){
	maxzero[rt]=prefix[rt]=suffix[rt]=r-l+1;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
}
void modify(int l,int r,int rt){
	if(s<=l&&t>=r){
		maxzero[rt]=prefix[rt]=suffix[rt]=((d)?(0):(r-l+1));
		lazy[rt]=d;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(l,r,mid,rt);
	if(s<=mid)modify(l,mid,rt<<1);
	if(t>mid)modify(mid+1,r,rt<<1|1);
	refresh(l,r,mid,rt);
}
void query(int l,int r,int rt){
	if(t>=r){
		//printf("rt=%d pr=%d sm=%d\n",rt,pr,sm);
		ans=max(ans,maxzero[rt]);
		if(pr)ans=max(ans,suffix[pr]+prefix[rt]);
		ans=max(ans,sm+prefix[rt]);
		if(maxzero[rt]==r-l+1)sm+=r-l+1;
		else sm=suffix[rt];
		pr=rt;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(l,r,mid,rt);
	query(l,mid,rt<<1);
	if(t>mid)query(mid+1,r,rt<<1|1);
}
void pushdown(int l,int r,int mid,int rt){
	if(lazy[rt]==-1)return;
	int lc=rt<<1,rc=lc|1;
	if(lazy[rt])maxzero[lc]=prefix[lc]=suffix[lc]=maxzero[rc]=prefix[rc]=suffix[rc]=0;
	else{
		maxzero[lc]=prefix[lc]=suffix[lc]=mid-l+1;
		maxzero[rc]=prefix[rc]=suffix[rc]=r-mid;
	}
	lazy[lc]=lazy[rc]=lazy[rt];
	lazy[rt]=-1;
}
void refresh(int l,int r,int mid,int rt){
	int lc=rt<<1,rc=lc|1;
	maxzero[rt]=max(suffix[lc]+prefix[rc],max(maxzero[lc],maxzero[rc]));
	if(maxzero[lc]==mid-l+1)prefix[rt]=mid-l+1+prefix[rc];
	else prefix[rt]=prefix[lc];
	if(maxzero[rc]==r-mid)suffix[rt]=r-mid+suffix[lc];
	else suffix[rt]=suffix[rc];
}
/*
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
Answer:
1
4
7
0
5
*/