#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 200105
int row,col,ans,flag;
int an[200105];
struct Tree{
int l,r,Max;
}tr[maxn*4];
void build(int L,int R,int idx)
{
tr[idx].l=L;
tr[idx].r=R;
tr[idx].Max=col;
if(tr[idx].l==tr[idx].r)
return ;
int mid=(tr[idx].l+tr[idx].r)/2;
build(tr[idx].l,mid,idx<<1);
build(mid+1,tr[idx].r,idx<<1|1);
}
void update(int idx,int a)
{
if(tr[idx].l==tr[idx].r)
{
tr[idx].Max-=a;
return ;
}
int mid=(tr[idx].l+tr[idx].r)/2;
if(tr[idx<<1].Max>=a)
update(idx<<1,a);
else if(tr[idx<<1|1].Max>=a)
update(idx<<1|1,a);
tr[idx].Max=max(tr[idx<<1].Max,tr[idx<<1|1].Max);
}
void query(int idx,int a)
{
if(flag)
return ;
if(tr[idx].Max<a)
return ;
if(tr[idx].l==tr[idx].r)
{
flag=1;
ans=tr[idx].l;
return ;
}
if(tr[idx<<1].Max>=a)
query(idx<<1,a);
else if(tr[idx<<1|1].Max>=a)
query(idx<<1|1,a);
else return ;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int i,j,m;
while(scanf("%d%d%d",&row,&col,&m)==3)
{
if(row > m)
row = m;
build(1,row,1);
//for(i=1;i<=row*3;i++)
// printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].Max);
// printf("*********************\n");
for(j=1;j<=m;j++)
{
scanf("%d",&an[j]);
flag=0;
ans=-1;
query(1,an[j]);
printf("%d\n",ans);
if(flag)
update(1,an[j]);
// for(i=1;i<=row*3;i++)
// printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].Max);
// printf("*********************\n");
}
}
return 0;
}
Billboard(线段树)
最新推荐文章于 2021-11-15 22:13:06 发布