POJ 3667 Hotel

来源:互联网 发布:淘宝手机积分怎么查 编辑:程序博客网 时间:2024/05/17 00:10
#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <string>using namespace std;int n, m;const int maxn = 55555;#define lc o*2#define rc o*2+1int lsum[maxn<<2], rsum[maxn<<2], msum[maxn<<2];int cover[maxn<<2];void build(int o, int L, int R){msum[o] = lsum[o] = rsum[o] = R-L+1;cover[o] = -1;if(L == R) return ;int M = L + (R-L)/2;build(lc, L, M);build(rc, M+1, R);}void pushup(int o, int m){lsum[o] = lsum[lc];rsum[o] = rsum[rc];if(lsum[o] == m - (m>>1)) lsum[o] += lsum[rc];if(rsum[o] == (m>>1)) rsum[o] += rsum[lc];msum[o] = max(lsum[rc] + rsum[lc], max(msum[lc], msum[rc]));}void pushdown(int o, int m){if(cover[o] != -1){cover[lc] = cover[rc] = cover[o];msum[lc] = lsum[lc] = rsum[lc] = cover[o]? 0: m-(m>>1);msum[rc] = lsum[rc] = rsum[rc] = cover[o]? 0: (m>>1);cover[o] = -1;}}void update(int o, int y1, int y2, int L, int R, int op){if(y1 <= L && y2 >= R){msum[o] = lsum[o] = rsum[o] = op? 0: (R-L+1);cover[o] = op;return ;}pushdown(o, R-L+1);int M = L + (R-L)/2;if(y1 <= M) update(lc, y1, y2, L, M, op);if(y2 > M) update(rc, y1, y2, M+1, R, op);pushup(o, R-L+1);}int query(int o, int L, int R, int v){if(L == R) return L;pushdown(o, R-L+1);int M = L + (R-L)/2;if(msum[lc] >= v) return query(lc, L, M, v);else if(lsum[rc] + rsum[lc] >= v) return (M-rsum[lc]+1);return query(rc, M+1, R, v);}void solve(){build(1, 1, n);int op, v;int y1, y2;while(m--){scanf("%d", &op);if(op == 1){scanf("%d", &v);if(msum[1] < v) { printf("0\n"); continue; }int p = query(1, 1, n, v);printf("%d\n", p);update(1, p, p+v-1, 1, n, 1);}else{scanf("%d%d", &y1, &y2);update(1, y1, y1+y2-1, 1, n, 0);}}}int main(){while(~scanf("%d%d", &n, &m)){solve();}return 0;}

原创粉丝点击