题意:
没看出来是个线段树,,, 很惭愧,,
n 层 对应 n个节点,每次查询更新整颗线段树,并且将根节点记录为最大的剩余的值,
建树的时候, 我们要知道 线段树节点数 最大也仅仅为min(n,h),h>nmin(n,h),h>n多的没有意义
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;
#define CLR(a,b) memset(a,(b),sizeof(a))
#define pb push_back
#define ll long long
#define ls st<<1
#define rs st<<1|1
const int MAXN = 2e5+10;
int h, w, n;
struct node {
int l, r;
int x;
}t[MAXN<<2];
void build(int l, int r, int st) {
t[st].l = l; t[st].r = r;
t[st].x = w;
if(l == r) {
return;
}
int mid = (l+r)>>1;
build(l,mid,ls); build(mid+1,r,rs);
}
int query(int x, int st) {
if(t[st].l == t[st].r) {
t[st].x -= x;
return t[st].l;
}
int x1 = 0, x2 = 0;
if(x <= t[ls].x)
x1 = query(x, ls);
else
x2 = query(x, rs);
t[st].x = max(t[ls].x, t[rs].x);
return x1+x2;
}
int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(~scanf("%d%d%d",&h,&w,&n)) {
int x;
build(1,min(h,n),1);
for(int i = 1; i <= n; ++i) {
scanf("%d",&x);
if(t[1].x >= x)
printf("%d\n",query(x,1));
else
printf("-1\n");
}
}
return 0;
}