#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();
}
