这一题可以用线段树来做,就是最简单的线段树。
#include <iostream>
using namespace std;
#define MAX 200010
int w,fine;
struct Node
{
int r,l,mid,num,max;
}node[3*MAX];
int Max(int a,int b)
{
return a>b?a:b;
}
void init(int a,int b,int n)
{
node[n].r=b;
node[n].l=a;
node[n].mid=(a+b)/2;
node[n].num=w;
node[n].max=w;
if(a==b)
return ;
init(a,(a+b)/2,n*2);
init((a+b)/2+1,b,2*n+1);
}
void update(int n,int value)
{
if(node[n].r==node[n].l)
{
if(node[n].num>=value)
{
node[n].num-=value;
node[n].max-=value;
printf("%d\n",node[n].l);
return;
}
}
if(node[n*2].max>=value)
update(2*n,value);
else if(node[n*2+1].max>=value)
update(2*n+1,value);
else
printf("-1\n");
node[n].max=Max(node[n*2].max,node[2*n+1].max);
}
int main()
{
int h,n,m;
while(scanf("%d%d%d",&h,&w,&n)!=EOF)
{
if(h>n)
h=n;//这两句话不能少
init(1,h,1);
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
fine=0;
update(1,m);
}
}
return 0;
}