#include #include #include #include #define REP(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; typedef long long LL; typedef pair pii; template inline void read(T& num) { bool start=false,neg=false; char c; num=0; while((c=getchar())!=EOF) { if(c=='-') start=neg=true; else if(c>='0' && c<='9') { start=true; num=num*10+c-'0'; } else if(start) break; } if(neg) num=-num; } #define lowbit(x) (x)&(-x) const int maxn=(int)(1e6)+5; int father[maxn],v[200005],l[200005]; set t[maxn]; int n,m; inline void add(int x,int v) { for(;x<=n;x+=lowbit(x)) l[x]+=v; } void giligili(int a,int b) { for(set::iterator i=t[a].begin();i!=t[a].end();i++) { if(v[*i-1]==b) add(*i,-1); if(v[*i+1]==b) add(*i+1,-1); t[b].insert(*i); } for(set::iterator i=t[a].begin();i!=t[a].end();i++) v[*i]=b; t[a].clear(); } inline int sum(int x) { int res=0; for(;x;x-=lowbit(x)) res+=l[x]; return res; } void solve() { int mx=(int)(1e6); memset(l,0,sizeof(l)); memset(father,0,sizeof(father)); for(int i=0;i<=mx;i++) t[i].clear(); read(n);read(m); v[0]=v[n+1]=-1; for(int i=1;i<=n;i++) read(v[i]); for(int i=1;i<=n;i++) { father[v[i]]=v[i]; if(v[i]!=v[i-1]) add(i,1); t[v[i]].insert(i); } for(int i=1;i<=m;i++) { int opt,a,b; read(opt);read(a);read(b); if(opt==1) { if(a==b) continue; if(t[father[a]].size()>t[father[b]].size()) swap(father[a],father[b]); a=father[a];b=father[b]; giligili(a,b); } else { if(sum(b)-sum(a)==0) { printf("1\n"); } else { int res=sum(b)-sum(a)+1; printf("%d\n",res); } } } } int main() { int T; read(T); while(T--) solve(); return 0; }