using namespace std; const int kMaxN = 200001; int kMax[kMaxN<<2]; int kN, kW, kH; void (int rt) { kMax[rt] = max(kMax[rt<<1], kMax[rt<<1|1]); } void BuildTree(int l, int r, int rt) { if(l == r){ kMax[rt] = kW; return; } int mid = (l + r) >> 1; BuildTree(l, mid, rt<<1); BuildTree(mid+1, r, rt<<1|1); PushUp(rt); } int QueryTree(int w, int l, int r, int rt) { if(kMax[rt] < w) return -1; if(l == r) { kMax[rt] -= w; return l; } int mid = (l + r) >> 1; int ret = kMaxN; if(kMax[rt<<1] >= w) ret = min(ret, QueryTree(w, l, (l+r)>>1, rt<<1)); else ret = min(ret, QueryTree(w, mid + 1, r, rt<<1|1)); PushUp(rt); return ret; } int main() { while(scanf("%d %d %d", &kH,&kW, &kN)!=EOF) { kH = min(kN, kH); BuildTree(1, kH, 1); int w; for(int i = 0; i < kN; ++i) { scanf("%d", &w); printf("%dn", QueryTree(w, 1, kH, 1)); } } return 0; }
|
近期评论