hdu 2795线段树

#include<stdio.h>
#define N 200005
int h,w,n;
struct node {
    int x,y,max;
}a[N*3];
int mmax(int e,int f) {
    return e>f?e:f;
}
void creattree(int t,int x,int y) {
    a[t].x=x;
    a[t].y=y;
    a[t].max=w;
    if(x==y)
        return ;
    int temp=t*2;
      int mid=(x+y)/2;
      creattree(temp,x,mid);
      creattree(temp+1,mid+1,y);
}
int find(int t,int k) {
    if(a[t].x==a[t].y) {
        a[t].max-=k;
        return a[t].x;
    }int ans;
    int temp=t*2;
    int mid=(a[t].x+a[t].y)/2;
    if(a[temp].max>=k)
        ans=find(temp,k);
    else
        ans=find(temp+1,k);
    a[t].max=mmax(a[temp].max,a[temp+1].max);
    return ans;
}
int main() {
    int k;
    while(scanf("%d%d%d",&h,&w,&n)!=EOF) {
        if(h<n)//important
        creattree(1,1,h);//important
        else creattree(1,1,n);//important
        while(n--) {
            scanf("%d",&k);
            if(a[1].max<k)
                printf("-1\n");
            else
            printf("%d\n",find(1,k));
        }

    }
    return 0;
}
posted @ 2013-08-15 16:44  HYDhyd  阅读(95)  评论(0编辑  收藏  举报