#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void si(T &x) {
  register int c = getchar();
  x = 0;
  int neg = 0;
  for (; ((c<48 | c> 57) && c != '-'); c = getchar())
    ;
  if (c == '-') {
    neg = 1;
    c = getchar();
  }
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
  if (neg) x = -x;
}
long long bigmod(long long p, long long e, long long M) {
  long long ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return ret;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long modinverse(long long a, long long M) { return bigmod(a, M - 2, M); }
void io() { freopen("/Users/MyMac/Desktop/in.txt", "r", stdin); }
const int N = 4e5 + 5;
set<int> Ac;
vector<int> a;
struct Node {
  int len, L, R;
  Node(int len = 0, int L = 0, int R = 0) : len(len), L(L), R(R) {}
  bool operator<(const Node &a) const {
    if (len == a.len)
      return R > a.R;
    else
      return len > a.len;
  }
};
set<Node> S;
int Query() {
  Node P = *S.begin();
  S.erase(P);
  if (P.len % 2 == 0) {
    int k = P.len / 2 + P.L;
    if (k - P.L) S.insert(Node(k - P.L, P.L, k - 1));
    if (P.R - k) S.insert(Node(P.R - k, k + 1, P.R));
    return k;
  } else {
    int k = P.len / 2 + P.L;
    if (k - P.L) S.insert(Node(k - P.L, P.L, k - 1));
    if (P.R - k) S.insert(Node(P.R - k, k + 1, P.R));
    return k;
  }
}
set<int> Ins;
void Update(int pos) {
  auto b = Ins.lower_bound(pos), c = Ins.lower_bound(pos);
  b--;
  c++;
  S.erase(Node(pos - 1 - (*b + 1) + 1, *b + 1, pos - 1));
  S.erase(Node(*c - 1 - (pos + 1) + 1, pos + 1, *c - 1));
  S.insert(Node(*c - *b - 1, *b + 1, *c - 1));
}
struct Inp {
  int t;
  int L, R;
};
vector<Inp> Input;
map<int, int> Map;
long long Bit[N];
long long query(int x) {
  long long r = 0;
  for (int i = x; i > 0; i -= i & -i) r += Bit[i];
  return r;
}
void update(int x, int val) {
  for (int i = x; i < N; i += i & -i) Bit[i] += val;
}
int main() {
  int n, q;
  si(n);
  si(q);
  S.insert(Node(n, 1, n));
  Ins.insert(0);
  Ins.insert(n + 1);
  Inp temp;
  while (q--) {
    int t;
    si(t);
    temp.t = t;
    if (t == 0) {
      si(temp.L);
      si(temp.R);
      a.push_back((temp.L));
      a.push_back((temp.R));
    } else {
      int id = t;
      if (Ac.count(id)) {
        int pos = Map[id];
        Update(pos);
        Ac.erase(id);
        Ins.erase(pos);
      } else {
        int u = Query();
        Map[id] = u;
        Ins.insert(u);
        a.push_back((u));
        Ac.insert(id);
      }
    }
    Input.push_back((temp));
  }
  S.clear();
  Ins.clear();
  Map.clear();
  Ins.insert(0);
  Ac.clear();
  Ins.insert(n + 1);
  S.insert(Node(n, 1, n));
  sort((a).begin(), (a).end());
  a.resize(unique((a).begin(), (a).end()) - a.begin());
  for (int i = 0; i < Input.size(); i++) {
    Inp u = Input[i];
    if (u.t == 0) {
      int L = lower_bound((a).begin(), (a).end(), u.L) - a.begin() + 1;
      int R = lower_bound((a).begin(), (a).end(), u.R) - a.begin() + 1;
      printf("%lld\n", query(R) - query(L - 1));
    } else {
      int id = u.t;
      if (Ac.count(id)) {
        int pos = Map[id];
        Update(pos);
        update(lower_bound((a).begin(), (a).end(), pos) - a.begin() + 1, -1);
        Ins.erase(pos);
        Ac.erase(id);
      } else {
        int u = Query();
        Map[id] = u;
        update(lower_bound((a).begin(), (a).end(), u) - a.begin() + 1, 1);
        Ins.insert(u);
        Ac.insert(id);
      }
    }
  }
  return 0;
}
