#include<cstdio>
void swap(int &x,int &y){x^=y^=x^=y;}
const int N=3e5+1;
void read(int &x){
char c=getchar();x=0;
while(c< '0'||c> '9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
}
void write(int x){
if(x>9) write(x/10);
putchar(x%10+'0');
}
void print(int x){
write(x);
puts("");
}
int n,m,tot;
int a[N],rt[N],t[N<<5],ls[N<<5],rs[N<<5];
void build(int x,int &k,int l,int r,int c){
k=++tot;
t[k]=t[x],ls[k]=ls[x],rs[k]=rs[x];
if(l==r){t[k]++;return ;}
int mid=(l+r)>>1;
if(c<=mid) build(ls[x],ls[k],l,mid,c);
if(c> mid) build(rs[x],rs[k],mid+1,r,c);
}
int query(int x,int k,int l,int r,int c){
if(l==r){return t[k]-t[x];}
int mid=(l+r)>>1;
if(c<=mid) return query(ls[x],ls[k],l,mid,c);
if(c> mid) return query(rs[x],rs[k],mid+1,r,c);
}
void change(int x,int l,int r,int c,int p){
if(l==r){t[x]+=p;return ;}
int mid=(l+r)>>1;
if(c<=mid) change(ls[x],l,mid,c,p);
if(c> mid) change(rs[x],mid+1,r,c,p);
}
int main(){
read(n),read(m);
for(int i=1;i<=n;i=-~i){
read(a[i]);
build(rt[i-1],rt[i],1,N,a[i]);
}
for(int i=1;i<=m;i=-~i){
int opt,l,r,c,x;
read(opt);
if(opt==1){
read(l),read(r),read(c);
print(query(rt[l-1],rt[r],1,N,c));
}
if(opt==2){
read(x);
change(rt[x],1,N,a[x],-1);
change(rt[x],1,N,a[x+1],1);
swap(a[x],a[x+1]);
}
}
return 0;
}