#include #include #include #include #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) using namespace std; inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } #define N 100005 #define M 1000005 int n,m,cnt; int c[N],Next[N],ft[M],head[M],s[M],st[M]; int sumv[N<<2]; void build(int o,int l,int r) { if(l==r) sumv[o]=0; else { int mid=l+r>>1,lc=o<<1,rc=lc|1; build(lc,l,mid);build(rc,mid+1,r); sumv[o]=sumv[lc]+sumv[rc]; } } int query(int o,int l,int r,int ql,int qr) { if(ql>qr) return 0; if(ql<=l&&r<=qr) return sumv[o]; int mid=l+r>>1,lc=o<<1,rc=lc|1,ans=0; if(ql<=mid) ans+=query(lc,l,mid,ql,qr); if(qr>mid) ans+=query(rc,mid+1,r,ql,qr); return ans; } void update(int o,int l,int r,int p,int v) { if(l==r) sumv[o]=v; else { int mid=l+r>>1,lc=o<<1,rc=lc|1; if(p<=mid) update(lc,l,mid,p,v); else update(rc,mid+1,r,p,v); sumv[o]=sumv[lc]+sumv[rc]; } } void merge(int a,int b) { for(int i=head[a];i;i=Next[i]) { if(c[i+1]==b) update(1,1,n,i,0); if(c[i-1]==b) update(1,1,n,i-1,0); } for(int i=head[a];i;i=Next[i])c[i]=b; Next[st[a]]=head[b];head[b]=head[a];s[b]+=s[a]; head[a]=st[a]=s[a]=0; } void solve() { n=read();m=read(); memset(ft,0,sizeof(ft)); memset(s,0,sizeof(s)); memset(head,0,sizeof(head)); memset(Next,0,sizeof(Next)); build(1,1,n); rep(i,1,n) { c[i]=read();ft[c[i]]=c[i]; if(i>1&&c[i]!=c[i-1]) update(1,1,n,i-1,1); if(!head[c[i]]) st[c[i]]=i; s[c[i]]++;Next[i]=head[c[i]];head[c[i]]=i; } while(m--) { int x=read(),a=read(),b=read(); if(x==2) printf("%d\n",query(1,1,n,a,b-1)+1); else { if(a==b) continue; if(s[ft[a]]>s[ft[b]]) swap(ft[a],ft[b]); a=ft[a];b=ft[b]; if(s[a]==0) continue; s[b]+=s[a];s[a]=0; merge(a,b); } } } int main() { dwn(T,read(),1) solve(); return 0; }