一个矩形框,一个1*n的矩形条。它能放在矩形框的最上最左的的行数。
那么,可以用线段树,表示第(1~h)行的最大空余。直接在query的时候,更新,即减去新加的长度。
#include <iostream>
using namespace std;
int sgTree[200005<<2];
int h,w,n,res;
void build(int l,int r,int c)
{
if(l==r)
{
sgTree[c]=w;
return;
}
int mid=(l+r)/2;
build(l,mid,c*2);
build(mid+1,r,c*2+1);
sgTree[c]=w;
}
void query(int l,int r,int c,int a)
{
if(l==r)
{
res=l;
sgTree[c]-=a;
return ;
}
int mid=(l+r)/2;
if(sgTree[c*2]>=a) query(l,mid,c*2,a);
else query(mid+1,r,c*2+1,a);
sgTree[c]=max(sgTree[c*2],sgTree[c*2+1]);
}
int main()
{
// freopen("in.txt","r",stdin);
int a;
while(scanf("%d %d %d",&h,&w,&n)==3)
{
if(h>n) h=n;
build(1,h,1);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(sgTree[1]<a) printf("-1\n");
else
{
query(1,h,1,a);
printf("%d\n",res);
}
}
}
return 0;
}