hdu 2795 Billboard

本题还是线段树单点更新的题目。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

#include <iostream>
#include <cstdio>

using namespace std;

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const int maxx=200002;

int maxn[maxx<<2];hdu 
int h,w,n;

int max(int a,int b){
	return a>b?a:b;
}

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

int query(int wi,int l,int r,int rt){
	if(l==r){
		maxn[rt] -= wi;
		return r;
	}
	int m=(l+r)>>1;
	int ret=0;
	if(maxn[rt<<1]>=wi) ret=query(wi,lson);
	else ret = query(wi,rson);
	maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]);
	return ret;
}

int main(){
	while(scanf("%d%d%d",&h,&w,&n)!=EOF){
		int wi;
		if(h>n)h=n;
		build(1,h,1);
		while(n--){
			scanf("%d",&wi);
			if(wi>maxn[1])printf("-1\n");
            else printf("%d\n",query(wi,1,h,1));
		}
	}
	return 0;
}


你可能感兴趣的:(query,Build)