#include<bits/stdc++.h>
using namespace std;
int x[300005];
int root[300005];
struct edge{
int l,r,val;
}y[10000000];
int top=0;
void up(int now,int had,int l,int r,int a,int p){
if(l==r&&l==a){
y[now].val=p;
return;
}
int mid=(l+r)/2;
if(a<=mid){
y[now].l=++top;
y[now].r=y[had].r;
up(y[now].l,y[had].l,l,mid,a,p);
}
else{
y[now].l=y[had].l;
y[now].r=++top;
up(y[now].r,y[had].r,mid+1,r,a,p);
}
y[now].val=y[y[now].l].val+y[y[now].r].val;
return;
}
int down(int now,int l,int r,int fl,int fr){
if(now==0)return 0;
if(l==fl&&r==fr)return y[now].val;
int mid=(l+r)/2;
if(fr<=mid)return down(y[now].l,1,mid,fl,fr);
else if(fl>mid)return down(y[now].r,mid+1,r,fl,fr);
else return down(y[now].l,1,mid,fl,mid)+down(y[now].r,mid+1,r,mid+1,fr);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&x[i]);
int rt=root[x[i]];
root[x[i]]=++top;
up(root[x[i]],rt,1,n,i,1);
}
while(m--){
int kind;
scanf("%d",&kind);
if(kind==1){
int l,r,colour;
scanf("%d%d%d",&l,&r,&colour);
printf("%d\n",down(root[colour],1,n,l,r));
}
else{
int a;
scanf("%d",&a);
int ra=++top;
up(ra,root[x[a+1]],1,n,a,1);
root[x[a+1]]=ra;
int rb=++top;
up(rb,root[x[a]],1,n,a+1,1);
root[x[a]]=rb;
ra=++top;
up(ra,root[x[a]],1,n,a,0);
root[x[a+1]]=ra;
rb=++top;
up(rb,root[x[a+1]],1,n,a+1,0);
root[x[a]]=rb;
swap(x[a],x[a+1]);
}
}
return 0;
}