#include <bits/stdc++.h>
using namespace std;
int st[400005];
int n, k, s, e;
bool flip = 0;
void build(int p, int l, int r) {
  if (l == r)
    st[p] = 1;
  else {
    build(p << 1, l, (l + r) / 2);
    build((p << 1) + 1, (l + r) / 2 + 1, r);
    st[p] = st[p << 1] + st[(p << 1) + 1];
  }
}
int query(int n, int l, int r, int ql, int qr) {
  if (qr < l || ql > r) return 0;
  if (l >= ql && r <= qr)
    return st[n];
  else {
    int m = (l + r) / 2;
    return query(n << 1, l, m, ql, qr) + query((n << 1) + 1, m + 1, r, ql, qr);
  }
}
void update(int n, int l, int r, int ix, int v) {
  if (ix < l || ix > r) return;
  if (l == r && l == ix)
    st[n] += v;
  else {
    int m = (l + r) / 2;
    if (ix <= m)
      update(n << 1, l, m, ix, v);
    else
      update((n << 1) + 1, m + 1, r, ix, v);
    st[n] = st[n << 1] + st[(n << 1) + 1];
  }
}
int out(int l, int r) {
  if (flip) {
    int nl, nr;
    nl = e - r + s + 1;
    nr = e - l + s + 1;
    return query(1, 1, n, nl, nr);
  } else
    return query(1, 1, n, l, r);
}
void foldR(int l) {
  int id = s + 2 * l;
  for (int i = s; i < s + l; i++) {
    int val = query(1, 1, n, i + 1, i + 1);
    update(1, 1, n, i + 1, -val);
    update(1, 1, n, id, val);
    id--;
  }
  s += l;
  flip = 0;
}
void foldL(int l) {
  int id = e - 2 * l + 1;
  for (int i = e; i > e - l; i--) {
    int val = query(1, 1, n, i, i);
    update(1, 1, n, i, -val);
    update(1, 1, n, id, val);
    id++;
  }
  e -= l;
  flip = 1;
}
int main() {
  scanf("%d %d", &n, &k);
  s = 0, e = n;
  build(1, 1, n);
  while (k--) {
    int task;
    scanf("%d", &task);
    if (task == 1) {
      int q;
      scanf("%d", &q);
      if (flip) {
        int nq = e - s - q;
        if (nq > (e - s) / 2)
          foldL(e - nq - s);
        else
          foldR(nq);
      } else {
        if (q > (e - s) / 2)
          foldL(e - q - s);
        else
          foldR(q);
      }
    } else {
      int ql, qr;
      scanf("%d %d", &ql, &qr);
      printf("%d\n", out(ql + s + 1, qr + s));
    }
  }
  return 0;
}
