/*
朴素的思想是用数组来模拟每一行,记录的是可用宽度,然后每次正序遍历得到答案,复杂度O(n*n)过大,因此想到数组常用的优化线段树,将时间复杂度降到O(nlogn)
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 200010;
int h,w,n;
struct segtree{
int l, r, sum;
int mid(){
return (l + r) >> 1;
}
}node[MAX << 2];
void buildtree(int l, int r, int rt){
node[rt].l = l;
node[rt].r = r;
node[rt].sum = w;
if(l == r) return;
int mid = node[rt].mid();
buildtree(l, mid, rt << 1);
buildtree(mid + 1, r, rt << 1 | 1);
}
int query(int num, int rt){
if(node[rt].l == node[rt].r){
node[rt].sum -= num;
return node[rt].l;
}
int mid = node[rt].mid();
int ret = 0;
if(node[rt << 1].sum >= num) ret = query(num, rt << 1);
else ret = query(num, rt << 1 | 1);
node[rt].sum = max(node[rt << 1].sum, node[rt << 1 | 1].sum);
return ret;
}
int main(){
while(scanf("%d%d%d",&h,&w,&n) == 3){
h = min(h, n);
buildtree(1, h, 1);
int W;
for(int i=1; i<=n; i++){
scanf("%d",&W);
if(node[1].sum < W) cout << "-1" << endl;
else cout << query(W, 1) << endl;
}
}
return 0;
}
hdu 2795 Billboard
最新推荐文章于 2020-04-10 12:25:14 发布