Billboard
题意:给定h*w的板子,每张海报宽wi 从上到下,从左至右贴海报,问每张海报贴的位置。
思路:线段树维护。
#include<bits/stdc++.h>
using namespace std;
int add[800005];
int h,w,n,ql,ans;
void build(int o,int l,int r){
add[o]=w;
if(l==r)
return;
int m=(l+r)/2;
build(o*2,l,m);
build(o*2+1,m+1,r);
}
void qu(int o,int l,int r){
if(l==r){
add[o]-=ql;
ans=l;
return;
}
int m=(l+r)/2;
if(add[o*2]>=ql)
qu(o*2,l,m);
else qu(o*2+1,m+1,r);
add[o]=max(add[o*2],add[o*2+1]);
}
int main(){
while(~scanf("%d%d%d",&h,&w,&n)){
memset(add,0,sizeof(add));
if(h>n)
h=n;
build(1,1,h);
for(int i=0;i<n;i++){
scanf("%d",&ql);
if(add[1]<ql)
puts("-1");
else{
qu(1,1,h);
printf("%d\n",ans);
}
}
}
}