#include #include #include #include #include #include #include #include #include #include #include #define LL long long #define inf 0x7ffffff #define pa pair #define pi 3.1415926535897932384626433832795028841971 using namespace std; inline LL read() { LL 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; } inline void write(LL a) { if (a<0){printf("-");a=-a;} if (a>=10)write(a/10); putchar(a%10+'0'); } inline void writeln(LL a){write(a);printf("\n");} int n,q,cnt; int a[100010]; int siz[1000010]; int fa[1000010]; struct segtree{ int l,r,sum,ll,rr; }t[500100]; struct lk{ int to,next; bool ok; }b[3000010]; int head[1000010]; inline void ins(int u,int v) { b[++cnt].to=v; b[cnt].ok=1; b[cnt].next=head[u]; head[u]=cnt; siz[u]++; } inline void update(int k) { if (t[k].l==t[k].r)return; t[k].sum=t[k<<1].sum+t[k<<1|1].sum-(t[k<<1].rr==t[k<<1|1].ll); t[k].ll=t[k<<1].ll;t[k].rr=t[k<<1|1].rr; } inline void buildtree(int now,int l,int r) { t[now].l=l;t[now].r=r; if (l==r) { t[now].ll=t[now].rr=a[l]; t[now].sum=1; return; } int mid=(l+r)>>1; buildtree(now<<1,l,mid); buildtree(now<<1|1,mid+1,r); update(now); } inline int ask(int now,int x,int y) { int l=t[now].l,r=t[now].r; if (x==l&&y==r)return t[now].sum; int mid=(l+r)>>1; if (y<=mid)return ask(now<<1,x,y); else if (x>mid)return ask(now<<1|1,x,y); else return ask(now<<1,x,mid)+ask(now<<1|1,mid+1,y)-(t[now<<1].rr==t[now<<1|1].ll); } inline void change(int now,int x,int d) { int l=t[now].l,r=t[now].r; if (l==r) { t[now].ll=t[now].rr=d; t[now].sum=1;return; } int mid=(l+r)>>1; if (x<=mid)change(now<<1,x,d); else change(now<<1|1,x,d); update(now); } inline void del(int u,int d) { for (int i=head[u];i;i=b[i].next) if (b[i].ok) { b[i].ok=0; siz[u]--; change(1,b[i].to,d); ins(d,b[i].to); } } inline void work() { memset(t,0,sizeof(t)); memset(b,0,sizeof(b)); memset(head,0,sizeof(head)); memset(siz,0,sizeof(siz)); for (int i=1;i<=1000000;i++)fa[i]=i; cnt=0; n=read();q=read(); for (int i=1;i<=n;i++) { a[i]=read(); ins(a[i],i); } buildtree(1,1,n); for(int i=1;i<=q;i++) { int opr=read(),x=read(),y=read(); if (opr==1) { if (x==y)continue; if (siz[fa[x]]>siz[fa[y]]) { del(fa[y],fa[x]); swap(fa[x],fa[y]); }else del(fa[x],fa[y]); }else if(opr==2)printf("%d\n",ask(1,x,y)); } } int main() { int T=read(); while (T--)work(); }