#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n,m,k,col[maxn],head[maxn],nex[maxn],to[maxn],ans,sz[maxn];
void add(int x,int y){
to[++k]=y;
nex[k]=head[x];
head[x]=k;
sz[x]++;
}
void merge(int s,int t){
if(s==t)return;
// if(sz[s]>sz[t])swap(s,t);
for(int i=head[s];i;i=nex[i]){
int y=to[i];
if(y-1>0&&col[y-1]==t)ans--;
if(y+1<=n&&t==col[y+1])ans--;
}
for(int i=head[s];i;i=nex[i]){
int y=to[i];
col[y]=t;
if(nex[i]==0){
nex[i]=head[t],head[t]=head[s];
break;
}
}
head[s]=0;
// sz[t]+=sz[s],sz[s]=0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&col[i]);
if(col[i]!=col[i-1])ans++;
add(col[i],i);
}
while(m--){
int op,s,t;
scanf("%d",&op);
if(op==2)printf("%d\n",ans);
else{
scanf("%d%d",&s,&t);
merge(s,t);
}
}
}
洛谷P3201 [HNOI2009] 梦幻布丁(启发式合并)
最新推荐文章于 2022-07-23 00:28:07 发布