/*
本题的题意: 给定一个广告栏, 高为h 宽为 w 现在给出k个高为1 宽度为l的告示
告示只能从最高处以及最左边开始粘贴, 现在需要求出每张告示在广告栏第几行进行粘贴。
(最高处为第一行)
本题思路:
暴力超时的思想, 设定一个一维数组,长度为h ,里面的值为w, 每输入一个l,就从左到右扫描一次 代码,观察数组的容量是否足够
容纳具体的值
本题可以利用线段树思想, 考察了线段树的单点最大值更新, 线段树首结点为左右子树结点的最大值, 如果左边能够存储,就遍历左子树
如果不能则遍历右子树, 如果最大值也就是线段树的首结点不能够存储输入的l那么显然就输出-1, 遍历到 l == r时也就是存储l的位置
时, 需要将该结点的值 - L
*/
/*
本题的题意: 给定一个广告栏, 高为h 宽为 w 现在给出k个高为1 宽度为l的告示
告示只能从最高处以及最左边开始粘贴, 现在需要求出每张告示在广告栏第几行进行粘贴。
(最高处为第一行)
本题思路:
暴力超时的思想, 设定一个一维数组,长度为h ,里面的值为w, 每输入一个l,就从左到右扫描一次 代码,观察数组的容量是否足够
容纳具体的值
本题可以利用线段树思想, 考察了线段树的单点最大值更新, 线段树首结点为左右子树结点的最大值, 如果左边能够存储,就遍历左子树
如果不能则遍历右子树, 如果最大值也就是线段树的首结点不能够存储输入的l那么显然就输出-1, 遍历到 l == r时也就是存储l的位置
时, 需要将该结点的值 - L
*/
#include<bits/stdc++.h>
using namespace std;
const int maxsize = 500010;
typedef long long ll;
int h, w, k, L;
struct Node{
int l, r, data;
}tree[maxsize * 4];
void build(int x, int l, int r) {
tree[x].data = w; tree[x].l = l; tree[x].r = r;
if(l == r) {
return;
}
int mid = (l + r)>>1;
build(x<<1, l, mid);
build(x<<1|1, mid + 1, r);
}
int update(int x, int data) {
int L = tree[x].l, R = tree[x].r;
if(L == R) {
tree[x].data -= data;
return L;
}
else {
int res = 0;
if(tree[x<<1].data >= data) res = update(x<<1, data);
else res = update(x<<1|1, data);
tree[x].data = max(tree[x<<1].data, tree[x<<1|1].data);
return res;
}
}
int main() {
while(scanf("%d%d%d", &h, &w, &k) != EOF) {
//memset(tree,0,sizeof(tree));
build(1, 1, min(h, maxsize)); // 需要添加min 否则会导致 runtime Error
while(k--) {
scanf("%d", &L);
if(tree[1].data < L) printf("-1\n");
else printf("%d\n", update(1, L));
}
}
return 0;
}