#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <list>
#define INF 0x3f3f3f
#define maxn 200000 + 50
#define juzheng 300
#define ll long long
using namespace std;
struct xx {
int left;
int right;
int val;
} tree[maxn + maxn + maxn + maxn];
int h,w,n,arr[maxn + 1000],ans;
void bulid_tree(int node,int left,int right) {
tree[node].left = left;
tree[node].right = right;
if(left == right)
tree[node].val = w;
else {
int mid = (left + right) / 2;
bulid_tree(node * 2,left,mid);
bulid_tree(node * 2 + 1,mid + 1,right);
tree[node].val = max(tree[node * 2].val,tree[node * 2 + 1].val);
}
}
void add(int node,int val) {
if(tree[node].left == tree[node].right) {
ans = tree[node].left;
tree[node].val -= val;
return;
}
else {
if(tree[node * 2].val >= val)
add(node * 2,val);
else if(tree[node * 2 + 1].val >= val)
add(node * 2 + 1,val);
tree[node].val = max(tree[node * 2].val,tree[node * 2 + 1].val);
}
}
int main() {
while(~scanf("%d %d %d",&h,&w,&n)) {
if(h > n)
h = n;
bulid_tree(1,1,h);
for(int i = 1; i <= n; i++)
scanf("%d",&arr[i]);
for(int i = 1; i <= n; i++){
if(tree[1].val >= arr[i]){
add(1,arr[i]);
printf("%d\n",ans);
}
else
printf("-1\n");
}
}
return 0;
}