#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <map>
#define int long long
using namespace std;
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;
}
const int N = 2e5+5;
int n,m;
int tot;
map<int,int>rt;
int st[N*10],top;
struct aa{
int lc,rc,lval,rval,ans;
void clear(){
lc=rc=lval=rval=ans=0;
}
}node[N*10];
void pushup(int u){
node[u].ans = node[node[u].lc].ans+node[node[u].rc].ans;
if(node[node[u].lc].rval&&node[node[u].rc].lval){
node[u].ans--;
}
node[u].lval = node[node[u].lc].lval;
node[u].rval = node[node[u].rc].rval;
}
int merge(int u,int v,int l,int r){
if(!u||!v){
return u+v;
}
if(l==r){
node[u].ans=node[v].ans;
node[u].lval = node[v].lval;
node[u].rval = node[v].rval;
node[v].clear();st[++top] = v;
return u;
}
int mid = (l+r)/2;
node[u].lc = merge(node[u].lc,node[v].lc,l,mid);
node[u].rc = merge(node[u].rc,node[v].rc,mid+1,r);
pushup(u);
node[v].clear();st[++top] = v;
return u;
}
int newnode(){
if(top){
node[st[top]].clear();
return st[top--];
}else{
return ++tot;
}
}
void ins(int &u,int l,int r,int x){
if(!u){
u = newnode();
}
if(l==r){
node[u].ans += 1;
node[u].lval += 1;
node[u].rval += 1;
return;
}
int mid = (l+r)/2;
if(x<=mid){
ins(node[u].lc,l,mid,x);
}else{
ins(node[u].rc,mid+1,r,x);
}
pushup(u);
}
int ans;
int zhi[N];
signed main(){
int col;
n = read();m = read();
for(int i=1;i<=n;i++){
col = read();
ins(rt[col],1,n,i);
zhi[i] = col;
}
sort(zhi+1,zhi+1+n);
int z = unique(zhi+1,zhi+1+n)-zhi-1;
for(int i=1;i<=z;i++){
ans+=node[rt[zhi[i]]].ans;
}
int op,x,y;
for(int i=1;i<=m;i++){
op = read();
if(op==1){
x = read();y = read();
if(x==y){
continue;
}
ans-=node[rt[x]].ans;
ans-=node[rt[y]].ans;
rt[y] = merge(rt[y],rt[x],1,n);
ans+=node[rt[y]].ans;
}else{
cout<<ans<<"\n";
}
}
return 0;
}