HDU-2795-Billboard
http://acm.hdu.edu.cn/showproblem.php?pid=2795
线段树,建树时要注意范围
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define N 200005
int h,w;
struct cam
{
int x;
int y;
int len;
}list[N*4];
int Max(int x,int y)
{
return x>y?x:y;
}
void build(int k,int x,int y)
{
list[k].x=x;
list[k].y=y;
list[k].len=w;
if(x==y)
return;
int mid=(x+y)/2;
build(k<<1,x,mid);
build(k<<1|1,mid+1,y);
}
void find(int k,int x)
{
if(list[k].len>=x)
{
if(list[k].x==list[k].y)
{
list[k].len-=x;
printf("%d\n",list[k].x);
return;
}
else if(list[2*k].len>=x)
{
find(k<<1,x);
list[k].len=Max(list[k<<1].len,list[k<<1|1].len);
}
else
{
find(k<<1|1,x);
list[k].len=Max(list[k<<1].len,list[k<<1|1].len);
}
}
else
printf("-1\n");
}
int main()
{
int t,k;
while(scanf("%d%d%d",&h,&w,&t)!=EOF)
{
if(h<N)
build(1,1,h);
else
build(1,1,N); //不需要管h,大于n的不会被贴到
while(t--)
{
scanf("%d",&k);
find(1,k);
}
}
return 0;
}