#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define REP(i,a,b) for(int i=(a);i<=(b);i++) #define PER(i,a,b) for(int i=(a);i>=(b);i--) #define RVC(i,S) for(int i=0;i<(S).size();i++) #define RAL(i,u) for(int i=fr[u];i!=-1;i=e[i].next) 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; } /*============ Header Template ============*/ #define lowbit(x) (x)&(-x) const int maxn=(int)(1e6)+5; int fa[maxn],v[200005],C[200005]; set t[maxn]; int n,m; inline void add(int x,int v) { for(;x<=n;x+=lowbit(x)) C[x]+=v; } inline int sum(int x) { int res=0; for(;x;x-=lowbit(x)) res+=C[x]; return res; } void modify(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(); } void solve() { int mx=(int)(1e6); memset(C,0,sizeof(C)); memset(fa,0,sizeof(fa)); REP(i,0,mx) t[i].clear(); read(n);read(m); v[0]=v[n+1]=-1; REP(i,1,n) read(v[i]); REP(i,1,n) { fa[v[i]]=v[i]; if(v[i]!=v[i-1]) add(i,1); t[v[i]].insert(i); } REP(i,1,m) { int opt,a,b; read(opt);read(a);read(b); if(opt==1) { if(a==b) continue; if(t[fa[a]].size()>t[fa[b]].size()) swap(fa[a],fa[b]); a=fa[a];b=fa[b]; modify(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; }