HDU 2795
题意:要求所贴广告在广告牌的最上面 最左边, 求每张广告对应的所在行数
#include <cstdio>
#include <algorithm>
using namespace std;
int node[(200000<<2) + 10];
int h, w, n, x;
void construct(int o, int l, int r)
{
node[o] = w;
if(l != r)
{
int m = (l+r) / 2;
construct(2*o, l, m);
construct(2*o+1, m+1, r);
}
}
int query(int o, int l, int r)
{
if(l == r)
{
node[o] -= x;
return l;
}
else
{
int m = (l+r) / 2;
int ans = node[2*o]>=x ? query(2*o, l, m) : query(2*o+1, m+1, r);
node[o] = max(node[2*o], node[2*o+1]);
return ans;
}
}
int main()
{
while(scanf("%d %d %d", &h, &w, &n) == 3)
{
h = min(h, n);
construct(1, 1, h);
while(n--)
{
scanf("%d", &x);
if(node[1] < x)
printf("-1\n");
else
printf("%d\n", query(1, 1, h));
}
}
return 0;
}