#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,A=2e6+5;
int n,m,a,rt[A<<4],ls[A<<4],rs[A<<4],s[A<<4],cnt=0,op,x,y,ans=0;
bool fl[A<<4],fr[A<<4];
void pushup(int rt){
bool l=fr[ls[rt]],r=fl[rs[rt]];
if(l&&r)s[rt]=s[ls[rt]]+s[rs[rt]]-1;
else s[rt]=s[ls[rt]]+s[rs[rt]];
fl[rt]=fl[ls[rt]],fr[rt]=fr[rs[rt]];
}
int add(int rt,int l,int r,int x){
if(!rt)rt=++cnt;
if(l==r){
s[rt]=1;
fl[rt]=fr[rt]=1;
return rt;
}
int mid=(l+r)>>1;
if(x<=mid)ls[rt]=add(ls[rt],l,mid,x);
else rs[rt]=add(rs[rt],mid+1,r,x);
pushup(rt);
return rt;
}
int merge(int rtx,int rty,int l,int r){
if(!rtx||!rty)return rtx+rty;
if(l==r){
s[rtx]=s[rty],s[rty]=0,fl[rtx]=fl[rty],fl[rty]=0,fr[rtx]=fr[rty],fr[rty]=0;
return rtx;
}
int mid=(l+r)>>1;
ls[rtx]=merge(ls[rtx],ls[rty],l,mid);
rs[rtx]=merge(rs[rtx],rs[rty],mid+1,r);
pushup(rtx);
s[rty]=fl[rty]=fr[rty]=0;
return rtx;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a;
ans-=s[rt[a]];
rt[a]=add(rt[a],1,n,i);
ans+=s[rt[a]];
}
while(m--){
cin>>op;
if(op==1){
cin>>x>>y;
if(x==y||!rt[x])continue;
ans-=s[rt[x]]+s[rt[y]];
rt[y]=merge(rt[y],rt[x],1,n);
s[rt[x]]=0;
ans+=s[rt[y]];
}
else{
cout<<ans<<'\n';
}
}
return 0;
}
测试点7-11没过,WA了。