#include<bits\stdc++.h>
using namespace std;
#define endl "\n"
struct node
{
int mn = 1e9 + 7;
node(int x = 0)
{
mn = x;
}
};
node out()
{
return node(1e9 + 7);
}
node proces(node a, node b)
{
node c;
c.mn = min(a.mn, b.mn);
return c;
}
int const nn = 4e5 + 1;
int n;
int a[nn];
node tree[nn];
int ans = 0;
void build_tree(int s, int e, int ind)
{
if (s == e)
{
tree[ind] = node(a[s]);
return;
}
int mid = (s + e) / 2;
build_tree(s, mid, ind * 2);
build_tree(mid + 1, e, (ind * 2) + 1);
tree[ind] = proces(tree[ind * 2], tree[(ind * 2) + 1]);
return;
}
void query(int ss, int se, int qs, int qe, int ind, int p)
{
//complete overlap
if (ss >= qs && se <= qe)
if (tree[ind].mn > p)
return;
// no overlap
if (qe<ss || qs>se)
return;
if (ss == se)
{
ans++;
tree[ind].mn = 1e9 + 7;
return;
}
int mid = (ss + se) / 2;
query(ss, mid, qs, qe, ind * 2, p);
query(mid + 1, se, qs, qe, ind * 2 + 1, p);
tree[ind].mn = min(tree[ind * 2].mn, tree[ind * 2 + 1].mn);
return;
}
void update(int ss, int se, int i, int new_val, int ind)
{
//case where the I is out of bound
if (i > se || i < ss)
return;
// leaf node
if (ss == se)
{
tree[ind] = node(new_val);
return;
}
//otherwise
int mid = (ss + se) / 2;
update(ss, mid, i, new_val, ind * 2);
update(mid + 1, se, i, new_val, ind * 2 + 1);
tree[ind] = proces(tree[ind * 2], tree[ind * 2 + 1]);
return;
}
void fast()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int32_t main()
{
fast();
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
a[i] = 1e9 + 7;
build_tree(1, n, 1);
while (m--)
{
int ty;
cin >> ty;
if (ty == 1)
{
int ind, h;
cin >> ind >> h;
ind++;
update(1, n, ind, h, 1);
}
else
{
int l, r, p;
cin >> l >> r >> p;
l++;
ans = 0;
query(1, n, l, r, 1, p);
cout << ans << endl;
}
}
}
I2luY2x1ZGU8Yml0c1xzdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgojZGVmaW5lIGVuZGwgIlxuIgoKCnN0cnVjdCBub2RlCnsKCWludCBtbiA9IDFlOSArIDc7Cglub2RlKGludCB4ID0gMCkKCXsKCQltbiA9IHg7Cgl9Cgp9Owpub2RlIG91dCgpCnsKCXJldHVybiBub2RlKDFlOSArIDcpOwp9Cm5vZGUgcHJvY2VzKG5vZGUgYSwgbm9kZSBiKQp7Cglub2RlIGM7CgljLm1uID0gbWluKGEubW4sIGIubW4pOwoJcmV0dXJuIGM7Cn0KaW50IGNvbnN0IG5uID0gNGU1ICsgMTsKaW50IG47CmludCBhW25uXTsKbm9kZSB0cmVlW25uXTsKaW50IGFucyA9IDA7CnZvaWQgYnVpbGRfdHJlZShpbnQgcywgaW50IGUsIGludCBpbmQpCnsKCWlmIChzID09IGUpCgl7CgkJdHJlZVtpbmRdID0gbm9kZShhW3NdKTsKCQlyZXR1cm47Cgl9CglpbnQgbWlkID0gKHMgKyBlKSAvIDI7CglidWlsZF90cmVlKHMsIG1pZCwgaW5kICogMik7CglidWlsZF90cmVlKG1pZCArIDEsIGUsIChpbmQgKiAyKSArIDEpOwoJdHJlZVtpbmRdID0gcHJvY2VzKHRyZWVbaW5kICogMl0sIHRyZWVbKGluZCAqIDIpICsgMV0pOwoJcmV0dXJuOwp9CnZvaWQgcXVlcnkoaW50IHNzLCBpbnQgc2UsIGludCBxcywgaW50IHFlLCBpbnQgaW5kLCBpbnQgcCkKewoJLy9jb21wbGV0ZSBvdmVybGFwCglpZiAoc3MgPj0gcXMgJiYgc2UgPD0gcWUpCgkJaWYgKHRyZWVbaW5kXS5tbiA+IHApCgkJCXJldHVybjsKCgkvLyBubyBvdmVybGFwCglpZiAocWU8c3MgfHwgcXM+c2UpCgkJcmV0dXJuOwoKCWlmIChzcyA9PSBzZSkKCXsKCQlhbnMrKzsKCQl0cmVlW2luZF0ubW4gPSAxZTkgKyA3OwoJCXJldHVybjsKCX0KCglpbnQgbWlkID0gKHNzICsgc2UpIC8gMjsKCSBxdWVyeShzcywgbWlkLCBxcywgcWUsIGluZCAqIDIsIHApOwoJIHF1ZXJ5KG1pZCArIDEsIHNlLCBxcywgcWUsIGluZCAqIDIgKyAxLCBwKTsKCSB0cmVlW2luZF0ubW4gPSBtaW4odHJlZVtpbmQgKiAyXS5tbiwgdHJlZVtpbmQgKiAyICsgMV0ubW4pOwoJIHJldHVybjsKfQp2b2lkIHVwZGF0ZShpbnQgc3MsIGludCBzZSwgaW50IGksIGludCBuZXdfdmFsLCBpbnQgaW5kKQoKewoJLy9jYXNlIHdoZXJlIHRoZSBJIGlzIG91dCBvZiBib3VuZCAKCWlmIChpID4gc2UgfHwgaSA8IHNzKQoJCXJldHVybjsKCgkvLyBsZWFmIG5vZGUgCglpZiAoc3MgPT0gc2UpCgl7CgkJdHJlZVtpbmRdID0gbm9kZShuZXdfdmFsKTsKCQlyZXR1cm47Cgl9CgkvL290aGVyd2lzZSAKCWludCBtaWQgPSAoc3MgKyBzZSkgLyAyOwoJdXBkYXRlKHNzLCBtaWQsIGksIG5ld192YWwsIGluZCAqIDIpOwoJdXBkYXRlKG1pZCArIDEsIHNlLCBpLCBuZXdfdmFsLCBpbmQgKiAyICsgMSk7CgoJdHJlZVtpbmRdID0gcHJvY2VzKHRyZWVbaW5kICogMl0sIHRyZWVbaW5kICogMiArIDFdKTsKCXJldHVybjsKfQp2b2lkIGZhc3QoKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwoJY2luLnRpZSgwKTsKCWNvdXQudGllKDApOwp9CmludDMyX3QgbWFpbigpCnsKCWZhc3QoKTsKCWludCBuLCBtOwoJY2luID4+IG4gPj4gbTsKCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCgkJYVtpXSA9IDFlOSArIDc7CgoJYnVpbGRfdHJlZSgxLCBuLCAxKTsKCXdoaWxlIChtLS0pCgl7CgkJaW50IHR5OwoJCWNpbiA+PiB0eTsKCQlpZiAodHkgPT0gMSkKCQl7CgkJCWludCBpbmQsIGg7CgkJCWNpbiA+PiBpbmQgPj4gaDsKCQkJaW5kKys7CgkJCXVwZGF0ZSgxLCBuLCBpbmQsIGgsIDEpOwoJCX0KCQllbHNlCgkJewoJCQlpbnQgbCwgciwgcDsKCQkJY2luID4+IGwgPj4gciA+PiBwOwoJCQlsKys7CgkJCWFucyA9IDA7CgkJCXF1ZXJ5KDEsIG4sIGwsIHIsIDEsIHApOwoJCQljb3V0IDw8IGFucyA8PCBlbmRsOwoJCX0KCgl9Cn0=