#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
const int maxm=1e6+10;
int n,m;
int col[maxm];
int col2[maxm];
int a[maxn];
int ans=0;
vector<int> g[maxm];
void turn(int x,int y){
for(int i=0;i<g[x].size();i++){
int now=g[x][i];
if(col[col2[now-1]]==y) ans--;
if(col[col2[now+1]]==y) ans--;
}
for(int i=0;i<g[x].size();i++){
int now=g[x][i];
col2[now]=y;
g[y].push_back(now);
}
while(g[x].size()){
g[x].pop_back();
}
return;
}
void solve(){
int op;
scanf("%d",&op);
if(op==2){
printf("%d\n",ans);
return;
}
else{
int x,y;
scanf("%d%d",&x,&y);
if(x!=y||!g[x].size()){
if(g[col[x]].size()>g[col[y]].size()){
turn(col[y],col[x]);
col[y]=x;
col[x]=y;
}
else{
turn(col[x],col[y]);
col[x]=y;
}
}
return;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=1e6;i++){
col[i]=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]!=a[i-1]) ans++;
g[a[i]].push_back(i);
col2[i]=a[i];
}
while(m--) solve();
return 0;
}
@s_o_t_b