#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 200010;
int tree[maxn<<2];//该区间宽度的最大值
int h, w, n;
void build(int l, int r, int rt);
int query(int x, int l, int r, int rt);
void pushup(int rt);
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(tree[1] < x)
{
printf("-1\n");
continue;
}
int ans = query(x, 1, h, 1);
printf("%d\n", ans);
}
}
return 0;
}
void pushup(int rt)
{
tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
}
int query(int x, int l, int r, int rt)
{
if(l == r)
{
tree[rt] -= x;
return l;
}
int mid = (l + r)>>1;
int ret;
if(tree[rt<<1] >= x)//优先左边
ret = query(x, l, mid, rt<<1);
else
ret = query(x, mid + 1, r, rt<<1|1);
pushup(rt);
return ret;
}
void build(int l, int r, int rt)
{
tree[rt] = w;
if(l == r)
return;
int mid = (l + r)>>1;
build(l, mid, rt<<1);
build(mid + 1, r, rt<<1|1);
}
线段树hdu2795-在query同时更新
最新推荐文章于 2020-12-04 17:45:45 发布