用到了find 和 合并操作
n,m<=1e6 m个可交换的位置对 1-n序列 求利用可交换的位置字典序最大
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define IO ios::sync_with_stdio(false);cin.tie(0);
#define pb push_back
typedef long long ll;
const int maxn=1e6+5;
const ll mod = 1e9+7;
int T,n,m,x,y,cnt,ans;
string s,t;
int pre[maxn],a[maxn];
int find(int x){
return pre[x]==x?x:pre[x]=find(pre[x]);//x父亲变为根 路径压缩
}
void merge(int x,int y){
int px=find(x),py=find(y);
if(px!=py){
pre[px]=py;
}
}
priority_queue<int> q[maxn];
int main() {
IO;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
pre[i]=i;
}
for(int i=1;i<=m;i++){
cin>>x>>y;
merge(x,y);
}
for(int i=1;i<=n;i++){
q[find(i)].push(a[i]);//位置的根把值放进去
}
for(int i=1;i<=n;i++){
cout<<q[find(i)].top();
q[find(i)].pop();
if(i!=n)
cout<<" ";
}
cout<<endl;
return 0;
}