#include <bits/stdc++.h>
#define R register
#define inl inline
#define fastios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define Debug(file) freopen(file".in","r",stdin);freopen(file".out","w",stdout);
using namespace std;
const int N = 3e5 + 5;
const int block = 1062;
int colour[N/block+5][N];
int a[N];
int n,m;
int main() {
fastios;
cin >> n >> m;
for(R int i = 1;i <= n;i ++){
cin >> a[i];
colour[(i+block-1)/block][a[i]] ++;
}
while(m--){
int l,r,op,x;
cin >> op;
if(op == 1){
cin >> l >> r >> x;
int lb,rb = -block,ans = 0;
for(R int i = N/block;i >= 1;i --){
if(i*block>=l&&l>(i-1)*block){
lb = i*block;
}
}
for(R int i = 1;i <= N/block;i ++){
if(i*block<=r&&(i+1)*block>r){
rb = i*block;
}
}
for(R int i = lb/block;i <= rb/block;i ++)ans+=colour[i][x];
for(R int i = l;(i < rb||rb<0) && i <= r;i ++)ans += (a[i]==x);
if(rb>0)for(R int i = rb + 1;i <= r ;i ++)ans += (a[i]==x);
cout << ans << endl;
}else{
cin >> x;
if((x+block-1)/block == (x+block)/block){
swap(a[x],a[x+1]);
}else{
int ltype = a[x];
int rtype = a[x+1];
swap(a[x],a[x+1]);
int lpart = (x+block-1)/block;
int rpart = (x+block)/block;
if(ltype != rtype){
colour[lpart][ltype] --;
colour[rpart][rtype] --;
colour[lpart][rtype] ++;
colour[rpart][ltype] ++;
}
}
}
}
return 0;
}