参考http://www.notonlysuccess.com/index.php/segment-tree-complete/
因为h的范围为(1,10^9),而n的范围是(1,200000)
而用到的h不会超过n个,所以h可以取(n,h)的最小值,那么h的范围也就变成了(1,200000)
线段树,求值过程中更新
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define N 200002
using namespace std;
int Max[N<<2],w;
void build(int L,int R,int rt){
Max[rt]=w;
if(L==R){
return ;
}
int mid=(L+R)>>1;
build(L,mid,rt<<1);
build(mid+1,R,rt<<1|1);
return ;
}
void pushup(int rt){
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
int get(int x,int L,int R,int rt){
if(L==R){
Max[rt]-=x;
return L;
}
int mid=(L+R)>>1;
int l=rt<<1,r=l|1;
int ret=Max[l]>=x?get(x,L,mid,l):get(x,mid+1,R,r);
pushup(rt);
return ret;
}
int main()
{
int x,h,n;
while(cin>>h>>w>>n){
memset(Max,0,sizeof(Max));
if(h>n)
h=n;
build(1,h,1);
while(n--){
scanf("%d",&x);
if(Max[1]<x)
printf("-1\n");
else
printf("%d\n",get(x,1,h,1));
}
}
return 0;
}