#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAX=200010;
const int MAXNODE=MAX<<2;
int maxn[MAXNODE];
int w;
void build_tree(int i,int left,int right)
{
if(left==right)
{
maxn[i]=w;
return;
}
build_tree(i<<1,left,(right+left)/2);
build_tree(i<<1|1,(right+left)/2+1,right);
maxn[i]=max(maxn[i<<1],maxn[i<<1|1]);
}
int query(int i,int l,int r,ll x)
{
if(l==r)
{
maxn[i]-=x;
return l;
}
int loc;
int mid=(l+r)/2;
if(maxn[i<<1]>=x)
loc=query(i<<1,l,mid,x);
else if(maxn[i<<1|1]>=x)
loc=query(i<<1|1,mid+1,r,x);
maxn[i]=max(maxn[i<<1],maxn[i<<1|1]);
return loc;
}
int main()
{
int h,n;
while(scanf("%d%d%d",&h,&w,&n)!=EOF)
{
h=min(h,n);
build_tree(1,1,h);
for(int i=1;i<=n;i++)
{
int wi;
scanf("%d",&wi);
if(wi>w)
{
printf("-1\n");
continue;
}
if(maxn[1]>=wi)
{
printf("%d\n",query(1,1,h,wi));
}
else
{
printf("-1\n");
}
}
}
return 0;
}
线段树2
最新推荐文章于 2021-05-20 21:22:32 发布