#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200009;
struct SegTreeNode {
  int left, right, len, lMax, rMax, Max;
  void init(int a, int b) {
    left = a;
    right = b;
    lMax = rMax = Max = len = b - a + 1;
  }
  void reSet(int key) { lMax = rMax = Max = key; }
} nod[MAXN << 2];
void build(int N, int a, int b) {
  nod[N].init(a, b);
  if (a == b) return;
  int mid = (a + b) >> 1;
  build(N << 1, a, mid);
  build(1 | (N << 1), mid + 1, b);
}
void update(int N, int pos, int key) {
  if (nod[N].len == 1) {
    nod[N].reSet(key);
    return;
  }
  int mid = (nod[N].left + nod[N].right) >> 1, x = N << 1, y = x | 1;
  if (mid >= pos)
    update(x, pos, key);
  else
    update(y, pos, key);
  nod[N].Max = max(nod[x].Max, max(nod[y].Max, nod[x].rMax + nod[y].lMax));
  nod[N].lMax = nod[x].lMax;
  if (nod[N].lMax == nod[x].len) nod[N].lMax += nod[y].lMax;
  nod[N].rMax = nod[y].rMax;
  if (nod[N].rMax == nod[y].len) nod[N].rMax += nod[x].rMax;
}
int query(int N, int cur) {
  if (nod[N].len == 1) return N;
  int x = N << 1, y = x | 1;
  if (nod[x].Max >= cur) return query(x, cur);
  if (nod[x].rMax + nod[y].lMax >= cur)
    return nod[x].right - nod[x].rMax + 1 + cur / 2;
  return query(y, cur);
}
int num2id[MAXN * 5];
int main() {
  int n, m, a, b, x, y, z, ans;
  while (scanf("%d%d", &n, &m) != EOF) {
    build(1, 1, n);
    while (m--) {
      scanf("%d%d", &a, &b);
      if (a == 1) {
        x = nod[1].lMax;
        y = nod[1].rMax;
        z = nod[1].Max;
        if (x >= y && x * 2 >= z)
          ans = 1;
        else if (y > x && y * 2 >= z + 2)
          ans = n;
        else {
          if (z % 2 == 0) --z;
          ans = query(1, z);
        }
        update(1, ans, 0);
        num2id[b] = ans;
        printf("%d\n", ans);
      } else {
        b = num2id[b];
        update(1, b, 1);
      }
    }
  }
  return 0;
}
