首先把线段树建好,这个题就很简单了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
typedef long long ll;
int h,w,n,k;
struct Tree{
int s;
int t;
int max;
}tree[540010];
void build(int s,int t,int id){
tree[id].s=s;
tree[id].t=t;
tree[id].max=w;
if(s!=t){
int mid=(tree[id].s+tree[id].t)>>1;
build(s,mid,id*2);
build(mid+1,t,id*2+1);
}
}
void insert(int s,int id,int colour){
if(tree[id].s==s && tree[id].t==s){
tree[id].max+=colour;
return ;
}
int mid=(tree[id].s+tree[id].t)>>1;
if(mid<s)
insert(s,id*2+1,colour);
else
insert(s,id*2,colour);
tree[id].max=tree[id*2].max>tree[id*2+1].max?tree[id*2].max:tree[id*2+1].max;
}
int query(int s,int id){
if(tree[id].max<s)
return -1;
if(tree[id].s==tree[id].t){
return tree[id].s;
}
int mid=(tree[id].s+tree[id].t)>>1;
if(tree[id*2].max>=s)
return query(s,id*2);
else
return query(s,id*2+1);
}
int main(){
int i;
while(scanf("%d %d %d",&h,&w,&n)==3){
k=h>n?n:h;
build(1,k,1);
for(i=1;i<=n;i++){
int tem;
scanf("%d",&tem);
int e=query(tem,1);
printf("%d\n",e);
if(e!=-1)
insert(e,1,-tem);
}
}
}