来源:HDU2795
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
int h,w,n;
const int MAXN = 200000+10;
int tree[MAXN<<2];
void pushup(int rt){
tree[rt]=max(tree[lson],tree[rson]);
}
void build(int rt,int left,int right){
tree[rt]=w;
if(left==right) return ;
int mid = (left + right) >> 1;
build(lson,left,mid);
build(rson,mid+1,right);
}
int query(int data,int rt,int left,int right){
if(left==right){
tree[rt]-=data;
return left;
}
int mid=(left+right)>>1;
int ans;
if(tree[lson] >= data) ans = query(data,lson,left,mid);
else ans=query(data,rson,mid+1,right);
pushup(rt);//在查询中修改
return ans;
}
int main(){
while(scanf("%d%d%d",&h,&w,&n)!=EOF){
int x;
if(h>n) h=n;//由于是每一个至少都是1,所以如果我们的h>n了,我们就没必要组织一个很大的线段树了
//维护值:区间中下属的最大值
build(1,1,h);
for(int i=0;i<n;i++){
scanf("%d",&x);
if(tree[1]<x) cout<<-1<<endl;//最大的长度都不可能放的下了,直接结束,不可能了
else cout<<query(x,1,1,h)<<endl;
}
}
return 0;
}