刚开始时感觉本题是二维线段树,然后分析一下貌似不是,就是求取区间最大值的位置,感觉和之前的那道求逆序数的有一部分很像,查询更新;这题是把查询和更新合在了一起;但是我这个弱菜不会写代码,之后果断参考了HH神牛的模板;ORZ。。。各种若,弱不经风,刚学线段树,以后要努力,第一次这么晚了还在写代码了,ORZ。。只有我这种若才才会熬夜。。。
好了今天到这里一会碎觉喽,不然会挂的。这几天看到网上很多新闻因为熬夜猝死的事情,我可不想这样的事情发生在我身上。。。
珍爱生命,远离代码
#include <cstdlib>
#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1 | 1
const int N=200005;
int num[N<<2],h,w,n;
void PushUp(int rt)
{
num[rt]=max(num[rt<<1],num[rt<<1|1]);
}
void build(int l,int r,int rt)
{
num[rt]=w;
if(l==r)return;
int mid=(l+r)>>1;
build(lson);
build(rson);
}
int Query(int val,int l,int r,int rt)
{
if(l==r)
{
num[rt] -= val;
return l;
}
int mid = (l+r) >> 1 ;
int res = num[rt<<1] >= val ? Query(val,lson) : Query(val,rson) ;
PushUp(rt);
return res;
}
int main(int argc, char *argv[])
{
int val;
while(~scanf("%d%d%d",&h,&w,&n))
{
if(h>n)h=n;
build(1,h,1);
while(n--)
{
scanf("%d",&val);
if(num[1]<val)printf("-1\n");
else{
printf("%d\n",Query(val,1,h,1));
}
}
}
return EXIT_SUCCESS;
}