#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, maxn;
} a[200010 << 2];
map<int, int> mymap;
int n, m, k, x, flag;
void construct(int o, int l, int r) {
  a[o].l = a[o].r = a[o].maxn = r - l + 1;
  if (l == r) return;
  int m = (l + r) >> 1;
  construct(2 * o, l, m);
  construct(2 * o + 1, m + 1, r);
}
int query(int o, int l, int r) {
  if (l == r) return l;
  int m = (l + r) >> 1;
  if ((a[2 * o].maxn + 1) / 2 >= k) return query(2 * o, l, m);
  if ((a[2 * o].r + a[2 * o + 1].l + 1) / 2 >= k) return m - a[2 * o].r + k;
  return query(2 * o + 1, m + 1, r);
}
void pushUp(int o, int l, int r) {
  int m = (l + r) >> 1;
  a[o].l = a[2 * o].l;
  a[o].r = a[2 * o + 1].r;
  if (a[o].l == m - l + 1) a[o].l += a[2 * o + 1].l;
  if (a[o].r == r - m) a[o].r += a[2 * o].r;
  a[o].maxn = max(a[2 * o].maxn, a[2 * o + 1].maxn);
  a[o].maxn = max(a[o].maxn, a[2 * o].r + a[2 * o + 1].l);
}
void update(int o, int l, int r) {
  if (l == r) {
    a[o].l = a[o].r = a[o].maxn = flag;
    return;
  }
  int m = (l + r) >> 1;
  if (x <= m)
    update(2 * o, l, m);
  else
    update(2 * o + 1, m + 1, r);
  pushUp(o, l, r);
}
int main() {
  mymap.clear();
  scanf("%d%d", &n, &m);
  construct(1, 1, n);
  while (m--) {
    int op, id;
    scanf("%d%d", &op, &id);
    if (op == 1) {
      k = max(a[1].l, a[1].r);
      k = max(k, (a[1].maxn + 1) / 2);
      if (k == a[1].l)
        x = 1;
      else
        x = query(1, 1, n);
      mymap[id] = x;
      flag = 0;
      printf("%d\n", x);
    } else {
      x = mymap[id];
      mymap.erase(id);
      flag = 1;
    }
    update(1, 1, n);
  }
  return 0;
}
