#include <bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;
const int N=4e5+10;
int pos[N],pl[N],pr[N],t;
int n,m,q,a[N];
vector<int> v[1000];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
void upd(int l,int r){
int L=pos[l],R=pos[r];
v[L][a[l]]--;
v[L][a[r]]++;
v[R][a[r]]--;
v[R][a[l]]++;
swap(a[l],a[r]);
}
int query(int l,int r,int c){
int L=pos[l],R=pos[r],res=0;
if(L==R){
for(int i=l;i<=r;i++){
if(a[i]==c) res++;
}
return res;
}
for(int i=l;i<=pr[L];i++)
if(a[i]==c) res++;
for(int i=pl[R];i<=r;i++)
if(a[i]==c) res++;
for(int i=L+1;i<R;i++)
res+=v[i][c];
return res;
}
int main(){
n=read();m=read();
t=sqrt(n);
for(int i=1;i<=n;i++){
a[i]=read();
pos[i]=(i-1)/t+1;
v[pos[i]].push_back(a[i]);
}
for(int i=1;i<=pos[n];i++){
pl[i]=pr[i-1]+1,pr[i]=min(n,pl[i]+t-1);
}
for(int i=1;i<=m;i++){
int c=read();
if(c==1){
int l=read(),r=read(),k=read();
printf("%d\n",query(l,r,k));
}
else{
int x=read();
upd(x,x+1);
}
}
return 0;
}