#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
map<int, int> mp;
int c[N], m, b[N], tot;
int lowbit(int x) { return x & -x; }
void update(int x, int val) {
  for (; x <= m; x += lowbit(x)) c[x] += val;
}
int get_sum(int x) {
  int ans = 0;
  for (; x; x -= lowbit(x)) ans += c[x];
  return ans;
}
struct node {
  int l, r, id;
  bool operator<(const node &a) const { return r < a.r; }
};
struct no {
  int len, id, r;
  bool operator<(const no &a) const {
    if (len == a.len)
      return r < a.r;
    else
      return len < a.len;
  }
};
struct query {
  int op, l, r;
} quer[N], quer1[N];
bool vis[N];
set<node> st;
priority_queue<no> q;
int main() {
  int n, Q;
  scanf("%d %d", &n, &Q);
  for (int i = 1; i <= Q; i++) {
    scanf("%d", &quer[i].op);
    if (quer[i].op == 0) scanf("%d %d", &quer[i].l, &quer[i].r);
    quer1[i] = quer[i];
  }
  int id = 0;
  q.push({n, ++id, n});
  st.insert({1, n, id});
  b[++tot] = 1;
  b[++tot] = n;
  for (int i = 1; i <= Q; i++) {
    if (quer[i].op) {
      b[++tot] = quer[i].op;
      if (mp[quer[i].op]) {
        int y = quer[i].op;
        quer[i].op = mp[y];
        mp[y] = false;
        node x;
        node xu;
        x.r = quer[i].op;
        auto it = st.lower_bound(x);
        no p;
        xu.id = ++id;
        auto is = it;
        if (it == st.begin())
          xu.l = quer[i].op;
        else {
          it--;
          if ((*it).r == quer[i].op - 1)
            xu.l = (*it).l, vis[(*it).id] = true, st.erase(it);
          else
            xu.l = quer[i].op;
        }
        if (is == st.end())
          xu.r = quer[i].op;
        else {
          if ((*is).l == quer[i].op + 1)
            xu.r = (*is).r, vis[(*is).id] = true, st.erase(is);
          else
            xu.r = quer[i].op;
        }
        p.r = xu.r;
        p.id = xu.id;
        p.len = xu.r - xu.l + 1;
        q.push(p);
        b[++tot] = xu.l;
        b[++tot] = xu.r;
        st.insert(xu);
      } else {
        while (q.size() && vis[q.top().id]) q.pop();
        no u = q.top();
        q.pop();
        node x;
        x.r = u.r;
        auto it = st.lower_bound(x);
        node l_x, r_x;
        int l = (*it).l, r = (*it).r;
        st.erase(it);
        if ((r - l + 1) & 1) {
          b[++tot] = (r + l) / 2;
          mp[quer[i].op] = (r + l) / 2;
          if (r == l)
            continue;
          else {
            l_x.l = l;
            l_x.id = ++id;
            l_x.r = (r + l) / 2 - 1;
            r_x.l = (r + l) / 2 + 1;
            r_x.id = ++id;
            r_x.r = r;
          }
          st.insert(l_x);
          st.insert(r_x);
          q.push({l_x.r - l_x.l + 1, l_x.id, l_x.r});
          q.push({r_x.r - r_x.l + 1, r_x.id, r_x.r});
          b[++tot] = l_x.l;
          b[++tot] = l_x.r;
          b[++tot] = r_x.l;
          b[++tot] = r_x.r;
        } else {
          b[++tot] = (r + l) / 2 + 1;
          mp[quer[i].op] = (r + l) / 2 + 1;
          if (r == l + 1) {
            l_x.l = l;
            l_x.id = ++id;
            l_x.r = l;
            st.insert(l_x);
            q.push({l_x.r - l_x.l + 1, l_x.id, l_x.r});
            b[++tot] = l_x.l;
            b[++tot] = l_x.r;
          } else {
            l_x.l = l;
            l_x.id = ++id;
            l_x.r = (r + l) / 2;
            r_x.l = (r + l) / 2 + 2;
            r_x.id = ++id;
            r_x.r = r;
            st.insert(l_x);
            st.insert(r_x);
            q.push({l_x.r - l_x.l + 1, l_x.id, l_x.r});
            q.push({r_x.r - r_x.l + 1, r_x.id, r_x.r});
            b[++tot] = l_x.l;
            b[++tot] = l_x.r;
            b[++tot] = r_x.l;
            b[++tot] = r_x.r;
          }
        }
      }
    } else
      b[++tot] = quer[i].l, b[++tot] = quer[i].r;
  }
  sort(b + 1, b + tot + 1);
  m = unique(b + 1, b + tot + 1) - b - 1;
  memset(vis, 0, sizeof vis);
  while (q.size()) q.pop();
  st.clear();
  mp.clear();
  id = 0;
  q.push({n, ++id, n});
  st.insert({1, n, id});
  for (int i = 1; i <= Q; i++) {
    quer[i] = quer1[i];
    if (quer[i].op) {
      if (mp[quer[i].op]) {
        int y = quer[i].op;
        quer[i].op = mp[y];
        mp[y] = false;
        int k = lower_bound(b + 1, b + m + 1, quer[i].op) - b;
        update(k, -1);
        node x;
        node xu;
        x.r = quer[i].op;
        auto it = st.lower_bound(x);
        no p;
        xu.id = ++id;
        auto is = it;
        if (it == st.begin())
          xu.l = quer[i].op;
        else {
          it--;
          if ((*it).r == quer[i].op - 1)
            xu.l = (*it).l, vis[(*it).id] = true, st.erase(it);
          else
            xu.l = quer[i].op;
        }
        if (is == st.end())
          xu.r = quer[i].op;
        else {
          if ((*is).l == quer[i].op + 1)
            xu.r = (*is).r, vis[(*is).id] = true, st.erase(is);
          else
            xu.r = quer[i].op;
        }
        p.r = xu.r;
        p.id = xu.id;
        p.len = xu.r - xu.l + 1;
        q.push(p);
        st.insert(xu);
      } else {
        while (q.size() && vis[q.top().id]) q.pop();
        no u = q.top();
        q.pop();
        node x;
        x.r = u.r;
        auto it = st.lower_bound(x);
        node l_x, r_x;
        int l = (*it).l, r = (*it).r;
        st.erase(it);
        if ((r - l + 1) & 1) {
          int k = lower_bound(b + 1, b + m + 1, (r + l) / 2) - b;
          update(k, 1);
          mp[quer[i].op] = (r + l) / 2;
          if (r == l)
            continue;
          else {
            l_x.l = l;
            l_x.id = ++id;
            l_x.r = (r + l) / 2 - 1;
            r_x.l = (r + l) / 2 + 1;
            r_x.id = ++id;
            r_x.r = r;
          }
          st.insert(l_x);
          st.insert(r_x);
          q.push({l_x.r - l_x.l + 1, l_x.id, l_x.r});
          q.push({r_x.r - r_x.l + 1, r_x.id, r_x.r});
        } else {
          int k = lower_bound(b + 1, b + m + 1, (r + l) / 2 + 1) - b;
          update(k, 1);
          mp[quer[i].op] = (r + l) / 2 + 1;
          if (r == l + 1) {
            l_x.l = l;
            l_x.id = ++id;
            l_x.r = l;
            st.insert(l_x);
            q.push({l_x.r - l_x.l + 1, l_x.id, l_x.r});
          } else {
            l_x.l = l;
            l_x.id = ++id;
            l_x.r = (r + l) / 2;
            r_x.l = (r + l) / 2 + 2;
            r_x.id = ++id;
            r_x.r = r;
            st.insert(l_x);
            st.insert(r_x);
            q.push({l_x.r - l_x.l + 1, l_x.id, l_x.r});
            q.push({r_x.r - r_x.l + 1, r_x.id, r_x.r});
          }
        }
      }
    } else {
      int k1 = lower_bound(b + 1, b + m + 1, quer[i].l) - b;
      int k2 = lower_bound(b + 1, b + m + 1, quer[i].r) - b;
      printf("%d\n", get_sum(k2) - get_sum(k1 - 1));
    }
  }
  return 0;
}
