//HNOI 梦幻糖果
//题意:n个布丁,m个颜色
//op1:把一个颜色的补丁全部变成另一种颜色
//op2:询问连续的颜色段个数
//表示方法:数组表示所有颜色,单链表表示颜色编号,让他们合并糖果
//启发式合并:元素少的合并到元素多的集合上
#include <cstdio>
#include <algorithm>
#include <cstring>
constexpr int NN{(int)(1e5)},MM{(int)(int)(1e6)};
int N,M,Q,op,ans = 0,h[MM],to[NN+1],ne[NN+1],tot,color[NN+1],sz[MM],p[MM];
inline void add(int u,int v){to[tot] = v,ne[tot] = h[u],h[u] = tot++;++sz[u];}
void merge(int &x,int &y){
if(x == y)return;
if(sz[x] > sz[y])std::swap(x,y);
int i,j;
for(i = h[x];~i;i = ne[i])
j = to[i],ans-=(int)(color[j-1] == y)+(int)(color[j+1] == y);
for(i = h[x];~i;i = ne[i])color[(j = to[i])] = y;
ne[i] = h[y],h[y] = h[x],h[x] = -1;
sz[y] += sz[x],sz[x] = 0;
}
int main(void){
scanf("%d%d",&N,&M);
memset(h,-1,sizeof h);
int i;
for(i = 1;i <= N;++i){
scanf("%d",color[i]);
ans += (int)(color[i] == color[i-1]);
add(color[i],i);
}
for(i = 0;i < M;++i)p[i] = i;
scanf("%d",&Q);
while(Q--){
scanf("%d",&op);
if(op == 2)printf("%d\n",ans);
else{
int x,y;scanf("%d%d",&x,&y);
merge(p[x],p[y]);
}
}
}