Hdu2795Billboard线段树

没啥好说的,直接搞。

#include<stdio.h>

#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int max[1000000];
int m;
int Max(int a, int b)
{
    if (a>b)
        return a;
    return b;
}
void up(int rt)
{
    max[rt] = Max(max[rt << 1], max[rt << 1 | 1]);
}

void build(int l, int r, int rt)
{
    max[rt] = m;
    if (l == r) return;
    int mid = (l + r) >> 1;
    build(lson);
    build(rson);
}

void ask(int len, int l, int r, int rt)
{
    if (l == r){
        printf("%d\n", l);
        max[rt] -= len;
        return;
    }
    int mid = (l + r) >> 1;
    if (len <= max[rt << 1])
        ask(len, lson);
    else
        ask(len, rson);
    up(rt);
}

int main()
{
    int n, k, len, i;
    while (scanf("%d%d%d", &n, &m, &k) != EOF){
        if (n>k) n = k;
        build(1, n, 1);
        for (i = 0; i<k; i++)
        {
            scanf("%d", &len);
            if (len>max[1]) puts("-1");
            else
                ask(len, 1, n, 1);
        }
    }
    return 0;
}

 

posted on 2014-08-21 22:37  一个西瓜  阅读(114)  评论(0编辑  收藏  举报

导航