#include <cstdio>
#define N 100010
#define M 1000010
int c[n],sum[m];
int next[n],last[m];
int head[m];
int f[m];
int N,m,ans;
inline int Read ()
{
int X=0,f=1;char Ch=getchar ();
while (ch< ' 0 ' | | Ch> ' 9 ') {if (ch== '-') F=-1;ch=getchar ();}
while (ch>= ' 0 ' &&ch<= ' 9 ') {x=x*10+ch-' 0 '; Ch=getchar ();}
return x*f;
}
inline void Move (int from,int to)
{
for (int i=head[from];i;i=next[i])
{
if (c[i+1]==to) ans--;
if (c[i-1]==to) ans--;
}
for (int i=head[from];i;i=next[i]) c[i]=to;
Next[last[from]]=head[to];head[to]=head[from];
sum[to]+=sum[from];sum[from]=head[from]=last[from]=0;
}
int main ()
{
N=read (); M=read ();
for (int i=1;i<=n;i++)
{
C[i]=read (); f[c[i]]=c[i];
if (c[i]!=c[i-1]) ans++;
if (!head[c[i]]) last[c[i]]=i;
next[i]=head[c[i]];head[c[i]]=i;sum[c[i]]++;
}
int opr,x,y,a,b;
for (int i=1;i<=m;i++)
{
Opr=read ();
if (opr==2) {printf ("%d\n", ans); continue;}
X=read (); Y=read ();
if (x==y) continue;
if (Sum[f[x]]>sum[f[y]])
{
int t=f[x];
F[x]=f[y];
f[y]=t;
}
A=f[x];b=f[y];
if (sum[a]==0) continue;
Move (A, b);
}
}
2014080503 Fantasy Pudding (c + +)