#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define input(v) for(auto &a:v)cin>>a;
#define output(v) for(auto &a:v)cout<<a<<" ";
#define outputel(v) for(auto &a:v)cout<<a<<" ";cout<<endl;
#define mem(arr) memset(arr,0,sizeof(arr));
#define LSone(x) (x & (-x))
#define YNO(x) cout<<(x ? "YES" : "NO")<<endl;
#define sz(x) (ll)x.size()
#define multpush(s,x) for(auto &c:x)s.push_back(c);
#define vc vector<char>
#define y second
#define x first
#define int ll
using namespace std;
void fastio() {
#ifdef LOCAL
freopen("input.txt", "r",stdin);
#else
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#endif
}
const ll MOD = 1e9 + 7;
const ll INF = 1e9 + 50;
const int MXS = 1e5 + 5;
const int NLOGN = 4e6 + 5;
struct SQRT
{
int SQ;
vector<map<int,int>> blockAns;
vector<vector<int>> blocks;
vector<map<int,int>> lazy;
SQRT(vector<int> &vec)
{
int n = vec.size();
SQ = sqrt(n) + 1;
blockAns = vector<map<int,int>> (SQ);
blocks = vector<vector<int>>(SQ, vector<int>(SQ));
lazy = vector<map<int,int>>(SQ);
for(int i = 0; i < n; i++)
{
blocks[i/SQ][i - i/SQ * SQ] = vec[i];
blockAns[i/SQ][vec[i]]++;
}
}
void querySet(int l, int r, int x)
{
int i = l;
blockAns[i/SQ][blocks[i/SQ][i - i/SQ * SQ]]--;
blocks[i/SQ][i - i/SQ * SQ] = x;
blockAns[i/SQ][x]++;
}
int getsum(int l, int r,int x)
{
int ans = 0;
// hna mashy inside block
for(int i = l; i < min(r+1, (l/SQ + 1) * SQ); i++)
ans += blocks[i/SQ][i - i/SQ * SQ] == x;
if(l/SQ == r/SQ)
return ans;
// ana hna mashy blocks
for(int i = l/SQ + 1; i < r/SQ; i++)
ans += blockAns[i][x];
// hna mashy inside block
for(int i = r/SQ * SQ; i <= r; i++)
ans += blocks[i/SQ][i - i/SQ * SQ] == x;
return ans;
}
};
void solve() {
int n,q;cin>>n>>q;
vector<int> v(n);
input(v);
SQRT sq(v);
while (q--) {
int op;cin>>op;
if (op == 0) {
int l,x;cin>>l>>x;
sq.querySet(l,l,x);
}else {
int l,r,x;cin>>l>>r>>x;
if (r==l) {
cout<<0<<endl;
}else cout<<sq.getsum(l,r-1,x)<<endl;
}
}
}
signed main() {
fastio();
int i = 1;
// cin>>i;
while (i--)
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZW5kbCAnXG4nCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSwgdi5lbmQoKQojZGVmaW5lIHJhbGwodikgdi5yYmVnaW4oKSwgdi5yZW5kKCkKI2RlZmluZSBpbnB1dCh2KSBmb3IoYXV0byAmYTp2KWNpbj4+YTsKI2RlZmluZSBvdXRwdXQodikgZm9yKGF1dG8gJmE6diljb3V0PDxhPDwiICI7CiNkZWZpbmUgb3V0cHV0ZWwodikgZm9yKGF1dG8gJmE6diljb3V0PDxhPDwiICI7Y291dDw8ZW5kbDsKI2RlZmluZSBtZW0oYXJyKSBtZW1zZXQoYXJyLDAsc2l6ZW9mKGFycikpOwojZGVmaW5lIExTb25lKHgpICh4ICYgKC14KSkKI2RlZmluZSBZTk8oeCkgY291dDw8KHggPyAiWUVTIiA6ICJOTyIpPDxlbmRsOwojZGVmaW5lIHN6KHgpIChsbCl4LnNpemUoKQojZGVmaW5lIG11bHRwdXNoKHMseCkgZm9yKGF1dG8gJmM6eClzLnB1c2hfYmFjayhjKTsKI2RlZmluZSB2YyB2ZWN0b3I8Y2hhcj4KI2RlZmluZSB5IHNlY29uZAojZGVmaW5lIHggZmlyc3QKI2RlZmluZSBpbnQgbGwKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgZmFzdGlvKCkgewojaWZkZWYgTE9DQUwKICAgIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIixzdGRpbik7CiNlbHNlCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7CiNlbmRpZgp9Cgpjb25zdCBsbCBNT0QgPSAxZTkgKyA3Owpjb25zdCBsbCBJTkYgPSAxZTkgKyA1MDsKY29uc3QgaW50IE1YUyA9IDFlNSArIDU7CmNvbnN0IGludCBOTE9HTiA9IDRlNiArIDU7CgpzdHJ1Y3QgU1FSVAp7CiAgICBpbnQgU1E7CiAgICB2ZWN0b3I8bWFwPGludCxpbnQ+PiBibG9ja0FuczsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gYmxvY2tzOwogICAgdmVjdG9yPG1hcDxpbnQsaW50Pj4gbGF6eTsKCiAgICBTUVJUKHZlY3RvcjxpbnQ+ICZ2ZWMpCiAgICB7CiAgICAgICAgaW50IG4gPSB2ZWMuc2l6ZSgpOwogICAgICAgIFNRID0gc3FydChuKSArIDE7CgogICAgICAgIGJsb2NrQW5zID0gdmVjdG9yPG1hcDxpbnQsaW50Pj4gKFNRKTsKICAgICAgICBibG9ja3MgPSB2ZWN0b3I8dmVjdG9yPGludD4+KFNRLCB2ZWN0b3I8aW50PihTUSkpOwogICAgICAgIGxhenkgPSB2ZWN0b3I8bWFwPGludCxpbnQ+PihTUSk7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJsb2Nrc1tpL1NRXVtpIC0gaS9TUSAqIFNRXSA9IHZlY1tpXTsKICAgICAgICAgICAgYmxvY2tBbnNbaS9TUV1bdmVjW2ldXSsrOwogICAgICAgIH0KICAgIH0KCgogICAgdm9pZCBxdWVyeVNldChpbnQgbCwgaW50IHIsIGludCB4KQogICAgewogICAgICAgIGludCBpID0gbDsKICAgICAgICBibG9ja0Fuc1tpL1NRXVtibG9ja3NbaS9TUV1baSAtIGkvU1EgKiBTUV1dLS07CiAgICAgICAgYmxvY2tzW2kvU1FdW2kgLSBpL1NRICogU1FdID0geDsKICAgICAgICBibG9ja0Fuc1tpL1NRXVt4XSsrOwoKICAgIH0KCiAgICBpbnQgZ2V0c3VtKGludCBsLCBpbnQgcixpbnQgeCkKICAgIHsKICAgICAgICBpbnQgYW5zID0gMDsKCiAgICAgICAgLy8gaG5hIG1hc2h5IGluc2lkZSBibG9jawogICAgICAgIGZvcihpbnQgaSA9IGw7IGkgPCBtaW4ocisxLCAobC9TUSArIDEpICogU1EpOyBpKyspCiAgICAgICAgICAgIGFucyArPSBibG9ja3NbaS9TUV1baSAtIGkvU1EgKiBTUV0gPT0geDsKCiAgICAgICAgaWYobC9TUSA9PSByL1NRKQogICAgICAgICAgICByZXR1cm4gYW5zOwoKICAgICAgICAvLyBhbmEgaG5hIG1hc2h5IGJsb2NrcwogICAgICAgIGZvcihpbnQgaSA9IGwvU1EgKyAxOyBpIDwgci9TUTsgaSsrKQogICAgICAgICAgICBhbnMgKz0gYmxvY2tBbnNbaV1beF07CgogICAgICAgIC8vIGhuYSBtYXNoeSBpbnNpZGUgYmxvY2sKICAgICAgICBmb3IoaW50IGkgPSByL1NRICogU1E7IGkgPD0gcjsgaSsrKQogICAgICAgICAgICBhbnMgKz0gYmxvY2tzW2kvU1FdW2kgLSBpL1NRICogU1FdID09IHg7CgogICAgICAgIHJldHVybiBhbnM7CiAgICB9Cn07Cgp2b2lkIHNvbHZlKCkgewogICAgaW50IG4scTtjaW4+Pm4+PnE7CiAgICB2ZWN0b3I8aW50PiB2KG4pOwogICAgaW5wdXQodik7CiAgICBTUVJUIHNxKHYpOwogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCBvcDtjaW4+Pm9wOwogICAgICAgIGlmIChvcCA9PSAwKSB7CiAgICAgICAgICAgIGludCBsLHg7Y2luPj5sPj54OwogICAgICAgICAgICBzcS5xdWVyeVNldChsLGwseCk7CiAgICAgICAgfWVsc2UgewogICAgICAgICAgICBpbnQgbCxyLHg7Y2luPj5sPj5yPj54OwogICAgICAgICAgICBpZiAocj09bCkgewogICAgICAgICAgICAgICAgY291dDw8MDw8ZW5kbDsKICAgICAgICAgICAgfWVsc2UgY291dDw8c3EuZ2V0c3VtKGwsci0xLHgpPDxlbmRsOwogICAgICAgIH0KICAgIH0KfQoKc2lnbmVkIG1haW4oKSB7CiAgICBmYXN0aW8oKTsKICAgIGludCBpID0gMTsKICAgIC8vIGNpbj4+aTsKICAgIHdoaWxlIChpLS0pCiAgICAgICAgc29sdmUoKTsKfQo=