#include <bits/stdc++.h>
#define rep(i, n) for (lli i = 0; i < (n); i++)
#define rrep(i, n) for (lli i = (n)-1; i >= 0; i--)
using namespace std;
using lli = long long int;
struct segtree {
vector<lli> dat, lazy;
int n;
lli unit = 0;
segtree(int N, vector<int> init)
{
n = 1;
while (N > n) {
n *= 2;
}
dat.assign(2 * n - 1, unit);
lazy.assign(2 * n - 1, unit);
rep(i, N)
{
dat[i + n - 1] = init[i];
}
rrep(i, n - 1) dat[i] = dat[2 * i + 1] + dat[2 * i + 2];
}
void eval(int k)
{
if (lazy[k] == 0)
return;
dat[k] *= (lazy[k] % 2 == 0 ? 1 : -1);
if (n - 1 > k) {
lazy[2 * k + 1] += lazy[k];
lazy[2 * k + 2] += lazy[k];
}
lazy[k] = 0;
}
void add(int a, int b, lli x)
{
add(a, b, x, 0, 0, n);
}
void add(int a, int b, lli x, int k, int l, int r)
{
eval(k);
if (b <= l || r <= a)
return;
if (a <= l && r <= b) {
lazy[k] += x;
eval(k);
} else {
add(a, b, x, 2 * k + 1, l, (l + r) / 2);
add(a, b, x, 2 * k + 2, (l + r) / 2, r);
dat[k] = dat[2 * k + 1] + dat[2 * k + 2];
}
}
lli query(int a, int b, int k, int l, int r)
{
eval(k);
if (b <= l || r <= a)
return 0;
if (a <= l and r <= b)
return dat[k];
lli vl = query(a, b, 2 * k + 1, l, (l + r) / 2);
lli vr = query(a, b, 2 * k + 2, (l + r) / 2, r);
return vl + vr;
}
lli query(int a, int b)
{
return query(a, b, 0, 0, n);
}
};
int main()
{
int n, p, q, a, b, c;
cin >> n;
vector<int> v(n, -1);
segtree seg(n, v);
cin >> q;
rep(i, q)
{
cin >> a >> b >> c;
if (a == 1) {
seg.add(b, c, 1);
} else {
int h = c - b;
cout << (seg.query(b, c) + h) / 2 << endl;
}
}
}