#include<bits/stdc++.h>
using namespace std;
#define lc(x) t[x].l
#define rc(x) t[x].r
struct stu{
int l,r,s;
}t[18000005];
int a[300005],root[300005],n,m,in;
void build(int &x,int l,int r){
x=++in;
if(l==r){
return;
}
int mid=(l+r)>>1;
build(lc(x),l,mid);
build(rc(x),mid+1,r);
}
void insert(int x,int &y,int l,int r,int k,int add){
y=++in;
t[y]=t[x];
t[y].s+=add;
if(l==r){
return;
}
int mid=(l+r)>>1;
if(k<=mid){
insert(lc(x),lc(y),l,mid,k,add);
}
else{
insert(rc(x),rc(y),mid+1,r,k,add);
}
}
int query(int x,int y,int l,int r,int k){
if(l==r){
return t[y].s-t[x].s;
}
int mid=(l+r)>>1;
if(k<=mid){
return query(lc(x),lc(y),l,mid,k);
}
else{
return query(rc(x),rc(y),mid+1,r,k);
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(root[0],1,n);
for(int i=1;i<=n;i++){
insert(root[i-1],root[i],1,n,a[i],1);
}
while(m--){
int op;
scanf("%d",&op);
if(op==1){
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
cout<<query(root[l-1],root[r],1,n,c)<<"\n";
}
else{
int x;
scanf("%d",&x);
insert(root[x-1],root[x],1,n,a[x+1],1);
swap(a[x],a[x+1]);
}
}
return 0;
}