http://acm.hust.edu.cn/vjudge/contest/view.action?cid=34869#problem/E
题意:场景是:给你一个有n个房间的宾馆,现在开房间是只能是连续的房间,1是查找,2是插入;当输入1时就输出能不能插入时房间的首个房间的序号,否则输出0;
当输入2时,删除从a开始的b个房间数;
线段树,懒惰标记,区间更新;
// 3e.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
const int maxn = 50005;
int lsum[ maxn << 2 ], rsum[ maxn << 2 ], msum[ maxn << 2 ], cove[ maxn << 2 ];
void PushUp( int rt, int m){
lsum[ rt ] = lsum[ rt << 1 ];
rsum[ rt ] = rsum[ rt << 1 | 1 ];
if( lsum[ rt ] == m - ( m >> 1 ) )
lsum[ rt ] += lsum[ rt << 1 | 1 ];
if( rsum[ rt ] == ( m >> 1 ) )
rsum[ rt ] += rsum[ rt << 1 ];
msum[ rt ] = max( lsum[ rt << 1 | 1 ] + rsum[ rt << 1 ], max( msum[ rt << 1 ], msum[ rt << 1 | 1 ] ) );
}
void PushDown( int rt, int m ){
if( cove[ rt ] != -1 ){
cove[ rt << 1 ] = cove[ rt << 1 | 1 ] = cove[ rt ];
lsum[ rt << 1 ] = rsum[ rt << 1 ] = msum[ rt << 1 ] = cove[ rt ]? 0: m - ( m >> 1 );
lsum[ rt << 1 | 1 ] = rsum[ rt << 1 | 1 ] = msum[ rt << 1 | 1 ] = cove[ rt ]? 0: ( m >> 1 );
cove[ rt ] = -1;
}
}
void Update( int L,int R, int c, int l, int r, int rt ){
if( L <= l && r <= R ){
lsum[ rt ] = rsum[ rt ] = msum[ rt ] = c ? 0: r - l + 1;
cove[ rt ] = c;
return;
}
PushDown( rt, r - l + 1 );
int m = ( l + r ) >> 1;
if( L <= m )
Update( L, R, c, lson );
if( R > m )
Update( L, R, c, rson );
PushUp( rt, r - l + 1 );
}
void Build( int l, int r, int rt ){
lsum[ rt ] = rsum[ rt ] = msum[ rt ] = r - l + 1;
cove[ rt ] = -1;
if( l == r )
return;
int m = ( l + r ) >> 1;
Build( lson );
Build( rson );
}
int Query( int x, int l, int r, int rt ){
if( l == r ){
return l;
}
PushDown( rt, r - l + 1 );
int m = ( l + r ) >> 1;
if( msum[ rt << 1 ] >= x )
return Query( x, lson );
else if( lsum[ rt << 1 | 1 ] + rsum[ rt << 1 ] >= x )
return m - rsum[ rt << 1 ] + 1;
else
return Query( x, rson );
}
int main()
{
int n, m, temp, a, b;
while( ~scanf( "%d%d", &n, &m ) ){
Build( 1, n, 1 );
while( m-- ){
cin >> temp;
if( temp == 1 ){
scanf( "%d", &a );
if( msum[ 1 ] < a )
puts( "0" );
else{
int ans = Query( a, 1, n, 1 );
//cout << ans << endl;
printf( "%d\n", ans );
Update( ans, ans + a - 1,1, 1, n, 1 );
}
}
else{
scanf( "%d%d", &a, &b );
Update( a, a + b - 1,0, 1, n, 1 );
}
}
}
return 0;
}