hdu2795Billboard(线段树)

http://acm.hdu.edu.cn/showproblem.php?pid=2795

单点更新,树存储的为某一行内剩余的长度

 

// File Name: hdu2795.cpp

// Author: bo_jwolf

// Created Time: 2013年08月16日 星期五 22时13分41秒



#include<vector>

#include<list>

#include<map>

#include<set>

#include<deque>

#include<stack>

#include<bitset>

#include<algorithm>

#include<functional>

#include<numeric>

#include<utility>

#include<sstream>

#include<iostream>

#include<iomanip>

#include<cstdio>

#include<cmath>

#include<cstdlib>

#include<cstring>

#include<ctime>



using namespace std;

#define maxn 200005

#define lson l , m , rt << 1 

#define rson m + 1 , r , rt << 1 | 1 



int Max[ maxn << 2 ] ;

int h  , w , n ;

void PushUp( int rt )

{

	 Max[ rt ] = max( Max[ rt << 1 ] , Max[ rt << 1 | 1 ] );

}



void build( int l , int r , int rt )

{		

	Max[ rt ] = w ;

	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 )

	{

		Max[ rt ] -= x ;

		return l ;

	}

	int m = ( l + r ) >> 1 ;

	int ret = ( Max[ rt << 1 ] >= x ) ? query( x , lson ) :query( x ,rson ) ;

	PushUp( rt ) ;

	return ret ;

}





int main()

{

	while( ~scanf( "%d%d%d" , &h ,&w , &n ) )

	{

		if( h > n ) 

			h = n ; 

		build( 1 , h , 1 ) ;

		while( n-- )

		{

			int x ;

			scanf( "%d" , &x ) ;

			if( Max[ 1 ] < x ) 

				printf( "-1\n" ) ;

			else

				printf( "%d\n" , query( x , 1 , h , 1 ) ) ;

		}

	}

return 0;

}


 

 

你可能感兴趣的:(HDU)