http://acm.hdu.edu.cn/showproblem.php?pid=2795
关键的一句话:
int ret = (x <= MAX[rt << 1] ? query(x , lson) : query(x , rson));
完整代码:
/*3484ms,3356KB*/ #include <cstdio> #include <algorithm> using namespace std; #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 #define root 1, h, 1 const int maxn = 200000; int MAX[maxn << 2]; void pushup(int rt) { MAX[rt] = max(MAX[rt << 1] , MAX[rt << 1 | 1]); } int query(int x, int l, int r, int rt) { if (l == r) { MAX[rt] -= x; return l; } int m = (l + r) >> 1; int ret = (x <= MAX[rt << 1] ? query(x , lson) : query(x , rson)); pushup(rt); return ret; } int main() { int h, w, n, x; while (~scanf("%d%d%d", &h, &w, &n)) { h = min(h, n); fill(MAX + 1, MAX + (h << 2), w); while (n--) { scanf("%d", &x); if (MAX[1] < x) puts("-1"); else printf("%d\n", query(x , root)); } } return 0; }