HDU 2795
线段树递归查询,取最大值建树
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#define LL __int64
using namespace std;
const int N=200050;
const int root=1;
struct Node {
int val,left,right;
}tree[N*4];
int h,w,n,wi;
void build(int now,int l,int r){
tree[now].val=w;
tree[now].left=l;
tree[now].right=r;
if(l==r) return ;
int m=(l+r)/2;
build(now*2,l,m);
build(now*2+1,m+1,r);
}
int query(int now,int l,int r){
if(l==r){
tree[now].val-=wi;
return l;
}
int m=(tree[now].left+tree[now].right)/2;
int ret;
if(wi<=tree[now*2].val){
ret=query(now*2,l,m);
}
else if(wi<=tree[now*2+1].val)
ret=query(now*2+1,m+1,r);
tree[now].val=max(tree[now*2].val,tree[now*2+1].val);
return ret;
}
int main(){
while(scanf("%d%d%d",&h,&w,&n)!=EOF){
int l=min(h,n);
build(root,1,l);
for(int i=1;i<=n;i++){
scanf("%d",&wi);
if(wi>tree[root].val) printf("-1\n");
else{
printf("%d\n",query(root,1,l));
}
}
}
return 0;
}

浙公网安备 33010602011771号