#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int N = 1e5 + 1, GC = 36, B = 320;
int id[N], gc = 0;
struct Group {
int len, sz, BS, BC;
struct Node {
int l, r;
ll val;
Node() = default;
Node(ll _val) : val(_val) {}
inline void assign(int _l, int _r) {
l = _l;
r = _r;
}
inline bool operator<(const Node &e) const { return val < e.val; }
} rlist[N];
struct Block {
int lo, hi, lb, rb;
ll lz;
Block() = default;
Block(int _rb) : rb(_rb) {}
inline bool operator<(const Block &b) const { return rb < b.rb; }
} 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].lb = rlist[blk[i].lo].l;
blk[i].rb = 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, Node((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].lb <= ql && qr <= blk[i].rb) {
if (blk[i].lb == ql && qr == blk[i].rb) blk[i].lz += (ll)v * len;
else modify(i, ql, qr, v);
return;
}
if (blk[i].lb < ql) {
modify(i, ql, blk[i].rb, v);
++i;
}
while (i <= BC && blk[i].rb <= qr) blk[i++].lz += (ll)v * len;
if (i > BC) return;
if (blk[i].lb <= qr) modify(i, blk[i].lb, 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].lb <= ql && qr <= blk[i].rb) {
if (blk[i].lb == ql && qr == blk[i].rb) return count(i, true, 0, 0, v);
return count(i, false, ql, qr, v);
}
int res = 0;
if (blk[i].lb < ql) {
res += count(i, false, ql, blk[i].rb, v);
++i;
}
while (i <= BC && blk[i].rb <= qr) res += count(i++, true, 0, 0, v);
if (i > BC) return res;
if (blk[i].lb <= qr) res += count(i, false, blk[i].lb, qr, v);
return res;
}
} grp[GC];
void build(int l, int r) {
const int len = r - l + 1;
int &lid = id[len];
if (!lid) {
lid = ++gc;
grp[gc].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 <= gc; ++i) grp[i].init();
while (m--) {
scanf("%d %d %d %d", &op, &l, &r, &a);
if (op == 1) for (int i = 1; i <= gc; ++i) grp[i].update(l, r, a);
else {
int res = 0;
for (int i = 1; i <= gc; ++i) res += grp[i].query(l, r, a);
printf("%d\n", res);
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKY29uc3RleHByIGludCBOID0gMWU1ICsgMSwgR0MgPSAzNiwgQiA9IDMyMDsKCmludCBpZFtOXSwgZ2MgPSAwOwoKc3RydWN0IEdyb3VwIHsKICAgIGludCBsZW4sIHN6LCBCUywgQkM7CgogICAgc3RydWN0IE5vZGUgewogICAgICAgIGludCBsLCByOwogICAgICAgIGxsIHZhbDsKCiAgICAgICAgTm9kZSgpID0gZGVmYXVsdDsKICAgICAgICBOb2RlKGxsIF92YWwpIDogdmFsKF92YWwpIHt9CgogICAgICAgIGlubGluZSB2b2lkIGFzc2lnbihpbnQgX2wsIGludCBfcikgewogICAgICAgICAgICBsID0gX2w7CiAgICAgICAgICAgIHIgPSBfcjsKICAgICAgICB9CgogICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBOb2RlICZlKSBjb25zdCB7IHJldHVybiB2YWwgPCBlLnZhbDsgfQogICAgfSBybGlzdFtOXTsKICAgIAogICAgc3RydWN0IEJsb2NrIHsKICAgICAgICBpbnQgbG8sIGhpLCBsYiwgcmI7CiAgICAgICAgbGwgbHo7CgogICAgICAgIEJsb2NrKCkgPSBkZWZhdWx0OwogICAgICAgIEJsb2NrKGludCBfcmIpIDogcmIoX3JiKSB7fQoKICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQmxvY2sgJmIpIGNvbnN0IHsgcmV0dXJuIHJiIDwgYi5yYjsgfQogICAgfSBibGtbQl07CgogICAgR3JvdXAoKSA9IGRlZmF1bHQ7CgogICAgaW5saW5lIHZvaWQgaW5pdCgpIHsKICAgICAgICBCUyA9IHNxcnQoc3opOwogICAgICAgIEJDID0gKHN6IC0gMSkgLyBCUyArIDE7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gQkM7ICsraSkgewogICAgICAgICAgICBibGtbaV0ubG8gPSBibGtbaSAtIDFdLmhpICsgMTsKICAgICAgICAgICAgYmxrW2ldLmhpID0gaSAqIEJTOwogICAgICAgIH0KICAgICAgICBibGtbQkNdLmhpID0gc3o7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gQkM7ICsraSkgewogICAgICAgICAgICBibGtbaV0ubGIgPSBybGlzdFtibGtbaV0ubG9dLmw7CiAgICAgICAgICAgIGJsa1tpXS5yYiA9IHJsaXN0W2Jsa1tpXS5oaV0ucjsKICAgICAgICB9CiAgICB9CgogICAgaW5saW5lIHZvaWQgbW9kaWZ5KGludCBwLCBpbnQgcWwsIGludCBxciwgaW50IHYpIHsKICAgICAgICBmb3IgKGludCBpID0gYmxrW3BdLmxvOyBpIDw9IGJsa1twXS5oaTsgKytpKSB7CiAgICAgICAgICAgIGlmIChybGlzdFtpXS5sID4gcXIgfHwgcmxpc3RbaV0uciA8IHFsKSBjb250aW51ZTsKICAgICAgICAgICAgcmxpc3RbaV0udmFsICs9IChsbCkobWluKHJsaXN0W2ldLnIsIHFyKSAtIG1heChybGlzdFtpXS5sLCBxbCkgKyAxKSAqIHY7CiAgICAgICAgfQogICAgICAgIHNvcnQocmxpc3QgKyBibGtbcF0ubG8sIHJsaXN0ICsgYmxrW3BdLmhpICsgMSk7CiAgICB9CgogICAgaW5saW5lIGludCBjb3VudChpbnQgcCwgYm9vbCBhbGwsIGludCBxbCwgaW50IHFyLCBpbnQgdikgewogICAgICAgIGlmIChhbGwpIHJldHVybiB1cHBlcl9ib3VuZChybGlzdCArIGJsa1twXS5sbywgcmxpc3QgKyBibGtbcF0uaGkgKyAxLCBOb2RlKChsbCl2IC0gYmxrW3BdLmx6KSkgLSBybGlzdCAtIGJsa1twXS5sbzsKICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICBmb3IgKGludCBpID0gYmxrW3BdLmxvOyBpIDw9IGJsa1twXS5oaTsgKytpKSByZXMgKz0gKHFsIDw9IHJsaXN0W2ldLmwgJiYgcmxpc3RbaV0uciA8PSBxciAmJiBybGlzdFtpXS52YWwgKyBibGtbcF0ubHogPD0gdik7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCB1cGRhdGUoaW50IHFsLCBpbnQgcXIsIGludCB2KSB7CiAgICAgICAgaW50IGkgPSBsb3dlcl9ib3VuZChibGsgKyAxLCBibGsgKyBCQyArIDEsIEJsb2NrKHFsKSkgLSBibGs7CiAgICAgICAgaWYgKGkgPiBCQykgcmV0dXJuOwogICAgICAgIGlmIChibGtbaV0ubGIgPD0gcWwgJiYgcXIgPD0gYmxrW2ldLnJiKSB7CiAgICAgICAgICAgIGlmIChibGtbaV0ubGIgPT0gcWwgJiYgcXIgPT0gYmxrW2ldLnJiKSBibGtbaV0ubHogKz0gKGxsKXYgKiBsZW47CiAgICAgICAgICAgIGVsc2UgbW9kaWZ5KGksIHFsLCBxciwgdik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGJsa1tpXS5sYiA8IHFsKSB7CiAgICAgICAgICAgIG1vZGlmeShpLCBxbCwgYmxrW2ldLnJiLCB2KTsKICAgICAgICAgICAgKytpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoaSA8PSBCQyAmJiBibGtbaV0ucmIgPD0gcXIpIGJsa1tpKytdLmx6ICs9IChsbCl2ICogbGVuOwogICAgICAgIGlmIChpID4gQkMpIHJldHVybjsKICAgICAgICBpZiAoYmxrW2ldLmxiIDw9IHFyKSBtb2RpZnkoaSwgYmxrW2ldLmxiLCBxciwgdik7CiAgICB9CgogICAgaW5saW5lIGludCBxdWVyeShpbnQgcWwsIGludCBxciwgaW50IHYpIHsKICAgICAgICBpbnQgaSA9IGxvd2VyX2JvdW5kKGJsayArIDEsIGJsayArIEJDICsgMSwgQmxvY2socWwpKSAtIGJsazsKICAgICAgICBpZiAoaSA+IEJDKSByZXR1cm4gMDsKICAgICAgICBpZiAoYmxrW2ldLmxiIDw9IHFsICYmIHFyIDw9IGJsa1tpXS5yYikgewogICAgICAgICAgICBpZiAoYmxrW2ldLmxiID09IHFsICYmIHFyID09IGJsa1tpXS5yYikgcmV0dXJuIGNvdW50KGksIHRydWUsIDAsIDAsIHYpOwogICAgICAgICAgICByZXR1cm4gY291bnQoaSwgZmFsc2UsIHFsLCBxciwgdik7CiAgICAgICAgfQogICAgICAgIGludCByZXMgPSAwOwogICAgICAgIGlmIChibGtbaV0ubGIgPCBxbCkgewogICAgICAgICAgICByZXMgKz0gY291bnQoaSwgZmFsc2UsIHFsLCBibGtbaV0ucmIsIHYpOwogICAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChpIDw9IEJDICYmIGJsa1tpXS5yYiA8PSBxcikgcmVzICs9IGNvdW50KGkrKywgdHJ1ZSwgMCwgMCwgdik7CiAgICAgICAgaWYgKGkgPiBCQykgcmV0dXJuIHJlczsKICAgICAgICBpZiAoYmxrW2ldLmxiIDw9IHFyKSByZXMgKz0gY291bnQoaSwgZmFsc2UsIGJsa1tpXS5sYiwgcXIsIHYpOwogICAgICAgIHJldHVybiByZXM7CiAgICB9Cn0gZ3JwW0dDXTsKCnZvaWQgYnVpbGQoaW50IGwsIGludCByKSB7CiAgICBjb25zdCBpbnQgbGVuID0gciAtIGwgKyAxOwogICAgaW50ICZsaWQgPSBpZFtsZW5dOwogICAgaWYgKCFsaWQpIHsKICAgICAgICBsaWQgPSArK2djOwogICAgICAgIGdycFtnY10ubGVuID0gbGVuOwogICAgfQogICAgZ3JwW2xpZF0ucmxpc3RbKytncnBbbGlkXS5zel0uYXNzaWduKGwsIHIpOwogICAgaWYgKGwgPT0gcikgcmV0dXJuOwogICAgY29uc3QgaW50IG1pZCA9IGwgKyByID4+IDE7CiAgICBidWlsZChsLCBtaWQpOwogICAgYnVpbGQobWlkICsgMSwgcik7Cn0KCmludCBtYWluKCkgewogICAgaW50IG4sIG0sIG9wLCBsLCByLCBhOwogICAgc2NhbmYoIiVkICVkIiwgJm4sICZtKTsKICAgIGJ1aWxkKDEsIG4pOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gZ2M7ICsraSkgZ3JwW2ldLmluaXQoKTsKICAgIHdoaWxlIChtLS0pIHsKICAgICAgICBzY2FuZigiJWQgJWQgJWQgJWQiLCAmb3AsICZsLCAmciwgJmEpOwogICAgICAgIGlmIChvcCA9PSAxKSBmb3IgKGludCBpID0gMTsgaSA8PSBnYzsgKytpKSBncnBbaV0udXBkYXRlKGwsIHIsIGEpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gZ2M7ICsraSkgcmVzICs9IGdycFtpXS5xdWVyeShsLCByLCBhKTsKICAgICAgICAgICAgcHJpbnRmKCIlZFxuIiwgcmVzKTsKICAgICAgICB9CiAgICB9Cn0=