mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
63 lines
1.4 KiB
C++
63 lines
1.4 KiB
C++
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <algorithm>
|
||
using namespace std;
|
||
|
||
int h,w,n;
|
||
int ans;
|
||
|
||
struct node
|
||
{
|
||
int l,r,n;
|
||
} a[1000000];
|
||
|
||
void init(int l,int r,int i,int w)//建树
|
||
{
|
||
a[i].l=l;
|
||
a[i].r=r;
|
||
a[i].n=w;
|
||
if(l!=r)
|
||
{
|
||
int mid=(l+r)/2;
|
||
init(l,mid,2*i,w);
|
||
init(mid+1,r,2*i+1,w);
|
||
}
|
||
}
|
||
|
||
void insert(int i,int x)
|
||
{
|
||
if(a[i].l == a[i].r)//到了叶子节点,叶子节点的值既是层数
|
||
{
|
||
a[i].n-=x;//该层宽度减少
|
||
ans = a[i].l;
|
||
return ;
|
||
}
|
||
if(x<=a[2*i].n)//符合要求搜左子树
|
||
insert(2*i,x);
|
||
else//否则右子树
|
||
insert(2*i+1,x);
|
||
a[i].n = max(a[2*i].n,a[2*i+1].n);//将左右子树里能放的最大长度存入父亲节点,进行更新
|
||
}
|
||
|
||
int main()
|
||
{
|
||
int i,k;
|
||
while(~scanf("%d%d%d",&h,&w,&n))
|
||
{
|
||
if(h>n)//根据题意,因为最多放n个公告,占用的最大高度也只有n,如果根据h的大小建树,由于h太大,这个树根本就建不起来,所以在这里就优化建树的高度
|
||
h = n;
|
||
init(1,h,1,w);
|
||
ans = -1;
|
||
for(i = 1; i<=n; i++)
|
||
{
|
||
scanf("%d",&k);
|
||
if(a[1].n>=k)//如果这个公告没有超出公告板的长度,那么才能放入
|
||
insert(1,k);
|
||
printf("%d\n",ans);
|
||
ans = -1;
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|