#include <iostream> #include <cstdio> #include <algorithm> #define LL(x) ((x) << 1) #define RR(x) ((x) << 1 | 1) using namespace std; const int N = 500005; struct Seg_tree { int l, r; int st; int l_size, size, r_size; int mid() { return (l + r) >> 1; } void doit() { l_size = size = r_size = st ? 0 : len(); /* if (st == 0) l_size = size = r_size = len(); else l_size = size = r_size = 0; */ } int len() { return (r - l + 1); } } tree[4 * N]; inline void Build(int l, int r, int node) { tree[node].l = l; tree[node].r = r; tree[node].st = -1; tree[node].l_size = tree[node].size = tree[node].r_size = tree[node].len(); if (l == r) { return; } //int mid = (r + l) >> 1; int mid = tree[node].mid(); Build(l, mid, LL(node)); Build(mid + 1, r, RR(node)); } inline void Update(int l, int r, int node, int st) { if (l <= tree[node].l && tree[node].r <= r) { tree[node].st = st; tree[node].doit(); return; } if (tree[node].st != -1) { tree[LL(node)].st = tree[RR(node)].st = tree[node].st; tree[LL(node)].doit(); tree[RR(node)].doit(); tree[node].st = -1; } int mid = tree[node].mid(); if(l <= mid) Update(l, r, LL(node), st); if(mid < r) Update(l, r, RR(node), st); /* if (r <= mid) { Update(l, r, LL(node), st); } else if (l > mid) { Update(l, r, RR(node), st); } else { Update(l, mid, LL(node), st); Update(mid + 1, r, RR(node), st); } */ tree[node].size = max(tree[LL(node)].r_size + tree[RR(node)].l_size, max( tree[LL(node)].size, tree[RR(node)].size)); tree[node].l_size = tree[LL(node)].l_size; tree[node].r_size = tree[RR(node)].r_size; if (tree[LL(node)].size == tree[LL(node)].len()) { tree[node].l_size += tree[RR(node)].l_size; } if (tree[RR(node)].size == tree[RR(node)].len()) { tree[node].r_size += tree[LL(node)].r_size; } } inline int Query(int size, int node) { if (tree[node].l == tree[node].r && size == 1) { return tree[node].l; } if (tree[node].st != -1) { tree[LL(node)].st = tree[RR(node)].st = tree[node].st; tree[LL(node)].doit(); tree[RR(node)].doit(); tree[node].st = -1; } if (tree[LL(node)].size >= size) { return Query(size, LL(node)); } else if (tree[LL(node)].r_size + tree[RR(node)].l_size >= size) { return tree[LL(node)].r - tree[LL(node)].r_size + 1; } else if (tree[RR(node)].size >= size) { return Query(size, RR(node)); } else { return 0; } } int main() { int n, m; while (scanf("%d %d", &n, &m) != EOF) { Build(1, n, 1); while (m--) { int ca; scanf("%d", &ca); if (ca == 1) { int a; scanf("%d", &a); int s = Query(a, 1); printf("%d/n", s); if (s) { Update(s, s + a - 1, 1, 1); } } else { int a, b; scanf("%d %d", &a, &b); Update(a, a + b - 1, 1, 0); } } } }