rt,谢谢啦~
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int M=1e6+110;
inline int read(){
int sum=0,k=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')k=-1;c=getchar();
}while(c>='0'&&c<='9'){sum=sum*10+c-48;c=getchar();
}return sum*k;
}
vector<int>a[M];
inline void Adde(int u,int v){
a[u].push_back(v);
}
int n=0,m=0,res=0;
int f[M],co[M],siz[M];
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
co[i]=read();
siz[co[i]]++;
Adde(co[i],i);
f[co[i]]=co[i];
if(co[i]!=co[i-1]) res++;
}
for(int i=1;i<=m;i++){
int op=read();
if(op==1){
int x=read(),y=read();
if(x==y) continue;
if(siz[f[x]]==siz[f[y]]&&siz[f[x]]==0) continue;
if(siz[f[x]]>siz[f[y]]){
for(auto v:a[f[y]]){
Adde(f[x],v);
if(co[v-1]==f[x]) res--;
if(co[v+1]==f[x]) res--;
}
for(auto v:a[f[y]]){
co[v]=f[x];
}
siz[f[x]]+=siz[f[y]];
siz[f[y]]=0;
f[y]=f[x];
// a[f[y]].clear();
continue;
}
else{
for(auto v:a[f[x]]){
Adde(f[y],v);
if(co[v-1]==f[y]) res--;
if(co[v+1]==f[y]) res--;
}
for(auto v:a[f[x]]){
co[v]=f[y];
}
siz[f[y]]+=siz[f[x]];
siz[f[x]]=0;
f[x]=f[y];
// a[f[x]].clear();
continue;
}
}
if(op==2){
printf("%lld\n",res);
continue;
}
}
return 0;
}