#include <bits/stdc++.h>
using namespace std;
int N, Q, L, R, T;
set<pair<int, int> > lis;
set<pair<int, pair<int, int> > > as;
void ins(int l, int r) {
  if (l > r) return;
  lis.insert(make_pair(l, r));
  as.insert(make_pair(r - l + 1, make_pair(l, r)));
}
void er(int l, int r) {
  if (l > r) return;
  lis.erase(make_pair(l, r));
  as.erase(make_pair(r - l + 1, make_pair(l, r)));
}
void ins2(int l, int r) {
  set<pair<int, int> >::iterator it = lis.lower_bound(make_pair(l, -(1 << 30)));
  if (it != lis.begin()) {
    it--;
    if (it->second + 1 == l) {
      l = it->first;
      er(it->first, it->second);
    }
  }
  it = lis.lower_bound(make_pair(l, (1 << 30)));
  if (it != lis.end()) {
    if (it->first == r + 1) {
      r = it->second;
      er(it->first, it->second);
    }
  }
  ins(l, r);
}
struct Node {
  int l, r, val;
  Node() { l = r = -1, val = 0; }
  Node(int l, int r, int val) : l(l), r(r), val(val) {}
} nd[4000000];
int ndptr = 1;
int segadd(int a, int b, int k, int l, int r, int s = 1) {
  if (r <= a || b <= l) return k;
  if (k == -1) k = ndptr++;
  if (a <= l && r <= b)
    nd[k].val += s;
  else {
    nd[k].l = segadd(a, b, nd[k].l, l, (l + r) / 2, s);
    nd[k].r = segadd(a, b, nd[k].r, (l + r) / 2, r, s);
    nd[k].val = nd[nd[k].l].val + nd[nd[k].r].val;
  }
  return k;
}
int sol(int a, int b, int k, int l, int r) {
  if (r <= a || b <= l || k == -1) return 0;
  if (a <= l && r <= b) return nd[k].val;
  return sol(a, b, nd[k].l, l, (l + r) / 2) +
         sol(a, b, nd[k].r, (l + r) / 2, r);
}
map<int, int> las;
int main() {
  scanf("%d%d", &N, &Q);
  ins(0, N - 1);
  while (Q--) {
    scanf("%d", &T);
    if (T == 0) {
      scanf("%d%d", &L, &R);
      L--;
      printf("%d\n", sol(L, R, 0, 0, 1 << 30));
    } else {
      if (las.count(T)) {
        int x = las[T];
        ins2(x, x);
        segadd(x, x + 1, 0, 0, 1 << 30, -1);
        las.erase(T);
      } else {
        pair<int, pair<int, int> > tmp = *(--as.end());
        er(tmp.second.first, tmp.second.second);
        int l = tmp.second.first, r = tmp.second.second;
        int x = (l + r + 1) / 2;
        segadd(x, x + 1, 0, 0, 1 << 30);
        ins(l, x - 1);
        ins(x + 1, r);
        las[T] = x;
      }
    }
  }
}
