poj2705
来源:互联网 发布:php数据库教程 编辑:程序博客网 时间:2024/06/07 05:18
#include<algorithm>#include<iostream>#include<cstdio>using namespace std;int a[200005];int tree[200005*4];int h,w,n;void Pushup(int p){ tree[p]=max(tree[p<<1],tree[p<<1|1]); //记录其子树中剩余的最大空间}void Build(int p,int l,int r){ if(l==r){ tree[p]=w; return; } int mid=(l+r)/2; Build(p<<1,l,mid); Build(p<<1|1,mid+1,r); Pushup(p);}int Update(int p,int l,int r,int x){ if(l==r){ tree[p]-=x; return l;} //更新叶子节点,即每条宽的长 int mid=(l+r)/2; int ret; if(tree[p<<1]>=x) ret=Update(p<<1,l,mid,x); else ret=Update(p<<1|1,mid+1,r,x); Pushup(p); //更新当前节点 return ret;}/*int Query(int p,int l,int r,int x,int y){ if(x<=l&&y>=r) return tree[p]; int mid=(l+r)/2; if(y<=mid) return Query(p<<1,l,mid,x,y); else if(x>mid) return Query(p<<1|1,mid+1,r,x,y); else return (Query(p<<1,l,mid,x,mid)+Query(p<<1|1,mid+1,r,mid+1,y));}*/int main(){ int n,m; while(scanf("%d%d%d",&h,&w,&n)!=EOF) { if(h>n) h=n; Build(1,1,h); int sum=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(tree[1]<a[i]) puts("-1"); else printf("%d\n",Update(1,1,h,a[i])); //写成coutTLE了 } } return 0;}
0 0