#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int N = 1e5 + 1, TC = 36, B = 350;
int id[N], tc = 0;
struct Group {
int len, sz, BS, BC;
struct Element {
int l, r;
ll val;
Element() = default;
Element(ll _val) : val(_val) {}
inline void assign(int _l, int _r) {
l = _l;
r = _r;
}
inline bool operator<(const Element &e) const { return val < e.val; }
} rlist[N];
struct Block {
int lo, hi, lmax, rmax;
ll lz;
Block() = default;
Block(int _rmax) : rmax(_rmax) {}
inline bool operator<(const Block &b) const { return rmax < b.rmax; }
} blk[B];
Group() = default;
inline void init() {
BS = sqrt(sz);
BC = (sz - 1) / BS + 1;
for (int i = 1; i <= BC; ++i) {
blk[i].lo = blk[i - 1].hi + 1;
blk[i].hi = i * BS;
}
blk[BC].hi = sz;
for (int i = 1; i <= BC; ++i) {
blk[i].lmax = rlist[blk[i].lo].l;
blk[i].rmax = rlist[blk[i].hi].r;
}
}
inline void modify(int p, int ql, int qr, int v) {
for (int i = blk[p].lo; i <= blk[p].hi; ++i) {
if (rlist[i].l > qr || rlist[i].r < ql) continue;
rlist[i].val += (ll)(min(rlist[i].r, qr) - max(rlist[i].l, ql) + 1) * v;
}
sort(rlist + blk[p].lo, rlist + blk[p].hi + 1);
}
inline int count(int p, bool all, int ql, int qr, int v) {
if (all) return upper_bound(rlist + blk[p].lo, rlist + blk[p].hi + 1, Element((ll)v - blk[p].lz)) - rlist - blk[p].lo;
int res = 0;
for (int i = blk[p].lo; i <= blk[p].hi; ++i) res += (ql <= rlist[i].l && rlist[i].r <= qr && rlist[i].val + blk[p].lz <= v);
return res;
}
inline void update(int ql, int qr, int v) {
int i = lower_bound(blk + 1, blk + BC + 1, Block(ql)) - blk;
if (i > BC) return;
if (blk[i].lmax <= ql && qr <= blk[i].rmax) {
if (blk[i].lmax == ql && qr == blk[i].rmax) blk[i].lz += (ll)v * len;
else modify(i, ql, qr, v);
return;
}
if (blk[i].lmax < ql) {
modify(i, ql, blk[i].rmax, v);
++i;
}
while (i <= BC && blk[i].rmax <= qr) blk[i++].lz += (ll)v * len;
if (i > BC) return;
if (blk[i].lmax <= qr) modify(i, blk[i].lmax, qr, v);
}
inline int query(int ql, int qr, int v) {
int i = lower_bound(blk + 1, blk + BC + 1, Block(ql)) - blk;
if (i > BC) return 0;
if (blk[i].lmax <= ql && qr <= blk[i].rmax) {
if (blk[i].lmax == ql && qr == blk[i].rmax) return count(i, true, 0, 0, v);
return count(i, false, ql, qr, v);
}
int res = 0;
if (blk[i].lmax < ql) {
res += count(i, false, ql, blk[i].rmax, v);
++i;
}
while (i <= BC && blk[i].rmax <= qr) res += count(i++, true, 0, 0, v);
if (i > BC) return res;
if (blk[i].lmax <= qr) res += count(i, false, blk[i].lmax, qr, v);
return res;
}
} grp[TC];
void build(int l, int r) {
const int len = r - l + 1;
int &lid = id[len];
if (!lid) {
lid = ++tc;
grp[tc].len = len;
}
grp[lid].rlist[++grp[lid].sz].assign(l, r);
if (l == r) return;
const int mid = l + r >> 1;
build(l, mid);
build(mid + 1, r);
}
int main() {
int n, m, op, l, r, a;
scanf("%d %d", &n, &m);
build(1, n);
for (int i = 1; i <= tc; ++i) grp[i].init();
while (m--) {
scanf("%d %d %d %d", &op, &l, &r, &a);
if (op == 1) for (int i = 1; i <= tc; ++i) grp[i].update(l, r, a);
else {
int res = 0;
for (int i = 1; i <= tc; ++i) res += grp[i].query(l, r, a);
printf("%d\n", res);
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKY29uc3RleHByIGludCBOID0gMWU1ICsgMSwgVEMgPSAzNiwgQiA9IDM1MDsKCmludCBpZFtOXSwgdGMgPSAwOwoKc3RydWN0IEdyb3VwIHsKICAgIGludCBsZW4sIHN6LCBCUywgQkM7CgogICAgc3RydWN0IEVsZW1lbnQgewogICAgICAgIGludCBsLCByOwogICAgICAgIGxsIHZhbDsKCiAgICAgICAgRWxlbWVudCgpID0gZGVmYXVsdDsKICAgICAgICBFbGVtZW50KGxsIF92YWwpIDogdmFsKF92YWwpIHt9CgogICAgICAgIGlubGluZSB2b2lkIGFzc2lnbihpbnQgX2wsIGludCBfcikgewogICAgICAgICAgICBsID0gX2w7CiAgICAgICAgICAgIHIgPSBfcjsKICAgICAgICB9CgogICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbGVtZW50ICZlKSBjb25zdCB7IHJldHVybiB2YWwgPCBlLnZhbDsgfQogICAgfSBybGlzdFtOXTsKICAgIAogICAgc3RydWN0IEJsb2NrIHsKICAgICAgICBpbnQgbG8sIGhpLCBsbWF4LCBybWF4OwogICAgICAgIGxsIGx6OwoKICAgICAgICBCbG9jaygpID0gZGVmYXVsdDsKICAgICAgICBCbG9jayhpbnQgX3JtYXgpIDogcm1heChfcm1heCkge30KCiAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEJsb2NrICZiKSBjb25zdCB7IHJldHVybiBybWF4IDwgYi5ybWF4OyB9CiAgICB9IGJsa1tCXTsKCiAgICBHcm91cCgpID0gZGVmYXVsdDsKCiAgICBpbmxpbmUgdm9pZCBpbml0KCkgewogICAgICAgIEJTID0gc3FydChzeik7CiAgICAgICAgQkMgPSAoc3ogLSAxKSAvIEJTICsgMTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBCQzsgKytpKSB7CiAgICAgICAgICAgIGJsa1tpXS5sbyA9IGJsa1tpIC0gMV0uaGkgKyAxOwogICAgICAgICAgICBibGtbaV0uaGkgPSBpICogQlM7CiAgICAgICAgfQogICAgICAgIGJsa1tCQ10uaGkgPSBzejsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBCQzsgKytpKSB7CiAgICAgICAgICAgIGJsa1tpXS5sbWF4ID0gcmxpc3RbYmxrW2ldLmxvXS5sOwogICAgICAgICAgICBibGtbaV0ucm1heCA9IHJsaXN0W2Jsa1tpXS5oaV0ucjsKICAgICAgICB9CiAgICB9CgogICAgaW5saW5lIHZvaWQgbW9kaWZ5KGludCBwLCBpbnQgcWwsIGludCBxciwgaW50IHYpIHsKICAgICAgICBmb3IgKGludCBpID0gYmxrW3BdLmxvOyBpIDw9IGJsa1twXS5oaTsgKytpKSB7CiAgICAgICAgICAgIGlmIChybGlzdFtpXS5sID4gcXIgfHwgcmxpc3RbaV0uciA8IHFsKSBjb250aW51ZTsKICAgICAgICAgICAgcmxpc3RbaV0udmFsICs9IChsbCkobWluKHJsaXN0W2ldLnIsIHFyKSAtIG1heChybGlzdFtpXS5sLCBxbCkgKyAxKSAqIHY7CiAgICAgICAgfQogICAgICAgIHNvcnQocmxpc3QgKyBibGtbcF0ubG8sIHJsaXN0ICsgYmxrW3BdLmhpICsgMSk7CiAgICB9CgogICAgaW5saW5lIGludCBjb3VudChpbnQgcCwgYm9vbCBhbGwsIGludCBxbCwgaW50IHFyLCBpbnQgdikgewogICAgICAgIGlmIChhbGwpIHJldHVybiB1cHBlcl9ib3VuZChybGlzdCArIGJsa1twXS5sbywgcmxpc3QgKyBibGtbcF0uaGkgKyAxLCBFbGVtZW50KChsbCl2IC0gYmxrW3BdLmx6KSkgLSBybGlzdCAtIGJsa1twXS5sbzsKICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICBmb3IgKGludCBpID0gYmxrW3BdLmxvOyBpIDw9IGJsa1twXS5oaTsgKytpKSByZXMgKz0gKHFsIDw9IHJsaXN0W2ldLmwgJiYgcmxpc3RbaV0uciA8PSBxciAmJiBybGlzdFtpXS52YWwgKyBibGtbcF0ubHogPD0gdik7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCB1cGRhdGUoaW50IHFsLCBpbnQgcXIsIGludCB2KSB7CiAgICAgICAgaW50IGkgPSBsb3dlcl9ib3VuZChibGsgKyAxLCBibGsgKyBCQyArIDEsIEJsb2NrKHFsKSkgLSBibGs7CiAgICAgICAgaWYgKGkgPiBCQykgcmV0dXJuOwogICAgICAgIGlmIChibGtbaV0ubG1heCA8PSBxbCAmJiBxciA8PSBibGtbaV0ucm1heCkgewogICAgICAgICAgICBpZiAoYmxrW2ldLmxtYXggPT0gcWwgJiYgcXIgPT0gYmxrW2ldLnJtYXgpIGJsa1tpXS5seiArPSAobGwpdiAqIGxlbjsKICAgICAgICAgICAgZWxzZSBtb2RpZnkoaSwgcWwsIHFyLCB2KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoYmxrW2ldLmxtYXggPCBxbCkgewogICAgICAgICAgICBtb2RpZnkoaSwgcWwsIGJsa1tpXS5ybWF4LCB2KTsKICAgICAgICAgICAgKytpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoaSA8PSBCQyAmJiBibGtbaV0ucm1heCA8PSBxcikgYmxrW2krK10ubHogKz0gKGxsKXYgKiBsZW47CiAgICAgICAgaWYgKGkgPiBCQykgcmV0dXJuOwogICAgICAgIGlmIChibGtbaV0ubG1heCA8PSBxcikgbW9kaWZ5KGksIGJsa1tpXS5sbWF4LCBxciwgdik7CiAgICB9CgogICAgaW5saW5lIGludCBxdWVyeShpbnQgcWwsIGludCBxciwgaW50IHYpIHsKICAgICAgICBpbnQgaSA9IGxvd2VyX2JvdW5kKGJsayArIDEsIGJsayArIEJDICsgMSwgQmxvY2socWwpKSAtIGJsazsKICAgICAgICBpZiAoaSA+IEJDKSByZXR1cm4gMDsKICAgICAgICBpZiAoYmxrW2ldLmxtYXggPD0gcWwgJiYgcXIgPD0gYmxrW2ldLnJtYXgpIHsKICAgICAgICAgICAgaWYgKGJsa1tpXS5sbWF4ID09IHFsICYmIHFyID09IGJsa1tpXS5ybWF4KSByZXR1cm4gY291bnQoaSwgdHJ1ZSwgMCwgMCwgdik7CiAgICAgICAgICAgIHJldHVybiBjb3VudChpLCBmYWxzZSwgcWwsIHFyLCB2KTsKICAgICAgICB9CiAgICAgICAgaW50IHJlcyA9IDA7CiAgICAgICAgaWYgKGJsa1tpXS5sbWF4IDwgcWwpIHsKICAgICAgICAgICAgcmVzICs9IGNvdW50KGksIGZhbHNlLCBxbCwgYmxrW2ldLnJtYXgsIHYpOwogICAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChpIDw9IEJDICYmIGJsa1tpXS5ybWF4IDw9IHFyKSByZXMgKz0gY291bnQoaSsrLCB0cnVlLCAwLCAwLCB2KTsKICAgICAgICBpZiAoaSA+IEJDKSByZXR1cm4gcmVzOwogICAgICAgIGlmIChibGtbaV0ubG1heCA8PSBxcikgcmVzICs9IGNvdW50KGksIGZhbHNlLCBibGtbaV0ubG1heCwgcXIsIHYpOwogICAgICAgIHJldHVybiByZXM7CiAgICB9Cn0gZ3JwW1RDXTsKCnZvaWQgYnVpbGQoaW50IGwsIGludCByKSB7CiAgICBjb25zdCBpbnQgbGVuID0gciAtIGwgKyAxOwogICAgaW50ICZsaWQgPSBpZFtsZW5dOwogICAgaWYgKCFsaWQpIHsKICAgICAgICBsaWQgPSArK3RjOwogICAgICAgIGdycFt0Y10ubGVuID0gbGVuOwogICAgfQogICAgZ3JwW2xpZF0ucmxpc3RbKytncnBbbGlkXS5zel0uYXNzaWduKGwsIHIpOwogICAgaWYgKGwgPT0gcikgcmV0dXJuOwogICAgY29uc3QgaW50IG1pZCA9IGwgKyByID4+IDE7CiAgICBidWlsZChsLCBtaWQpOwogICAgYnVpbGQobWlkICsgMSwgcik7Cn0KCmludCBtYWluKCkgewogICAgaW50IG4sIG0sIG9wLCBsLCByLCBhOwogICAgc2NhbmYoIiVkICVkIiwgJm4sICZtKTsKICAgIGJ1aWxkKDEsIG4pOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gdGM7ICsraSkgZ3JwW2ldLmluaXQoKTsKICAgIHdoaWxlIChtLS0pIHsKICAgICAgICBzY2FuZigiJWQgJWQgJWQgJWQiLCAmb3AsICZsLCAmciwgJmEpOwogICAgICAgIGlmIChvcCA9PSAxKSBmb3IgKGludCBpID0gMTsgaSA8PSB0YzsgKytpKSBncnBbaV0udXBkYXRlKGwsIHIsIGEpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gdGM7ICsraSkgcmVzICs9IGdycFtpXS5xdWVyeShsLCByLCBhKTsKICAgICAgICAgICAgcHJpbnRmKCIlZFxuIiwgcmVzKTsKICAgICAgICB9CiAgICB9Cn0=