#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <list>
#define INF 0x3f3f3f
#define maxn 200000 + 50
#define juzheng 300
#define ll long long
using namespace std;
//Date:2017-9-6
//Author:HarryBlackCat
struct xx {
int left;
int right;
int val;
} tree[maxn + maxn + maxn + maxn];
int h,w,n,arr[maxn + 1000],ans;
void bulid_tree(int node,int left,int right) {//每个节点为,各区间的最大长度
tree[node].left = left;
tree[node].right = right;
if(left == right)
tree[node].val = w;//初始化为w
else {
int mid = (left + right) / 2;
bulid_tree(node * 2,left,mid);
bulid_tree(node * 2 + 1,mid + 1,right);
tree[node].val = max(tree[node * 2].val,tree[node * 2 + 1].val);
}
}
void add(int node,int val) {
if(tree[node].left == tree[node].right) {
ans = tree[node].left;//找到最左最上的行数
tree[node].val -= val;//更新剩余的长度
return;
}
else {
if(tree[node * 2].val >= val)
add(node * 2,val);
else if(tree[node * 2 + 1].val >= val)
add(node * 2 + 1,val);
tree[node].val = max(tree[node * 2].val,tree[node * 2 + 1].val);//求区间最长长度
}
}
int main() {
while(~scanf("%d %d %d",&h,&w,&n)) {
if(h > n)//当h大于n时无意义
h = n;
bulid_tree(1,1,h);
for(int i = 1; i <= n; i++)
scanf("%d",&arr[i]);
for(int i = 1; i <= n; i++){
if(tree[1].val >= arr[i]){//如果总区间都大于第i个公告,搜索得到合适的行数
add(1,arr[i]);
printf("%d\n",ans);
}
else//否则直接输出-1
printf("-1\n");
}
}
return 0;
}
HDU 2795 Billboard(线段树-水题,模板题)
最新推荐文章于 2018-08-10 10:43:40 发布