Educational Codeforces Round 14-D. Swaps in Permutation

来源:互联网 发布:网络语言蛋炒饭的意思 编辑:程序博客网 时间:2024/05/16 13:43

原题链接

D. Swaps in Permutation
time limit per test
5 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given a permutation of the numbers 1, 2, ..., n and m pairs of positions (aj, bj).

At each step you can choose a pair from the given positions and swap the numbers in that positions. What is the lexicographically maximal permutation one can get?

Let p and q be two permutations of the numbers 1, 2, ..., np is lexicographically smaller than the q if a number 1 ≤ i ≤ n exists, so pk = qk for 1 ≤ k < i and pi < qi.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 106) — the length of the permutation p and the number of pairs of positions.

The second line contains n distinct integers pi (1 ≤ pi ≤ n) — the elements of the permutation p.

Each of the last m lines contains two integers (aj, bj) (1 ≤ aj, bj ≤ n) — the pairs of positions to swap. Note that you are given a positions, not the values to swap.

Output

Print the only line with n distinct integers p'i (1 ≤ p'i ≤ n) — the lexicographically maximal permutation one can get.

Example
input
9 61 2 3 4 5 6 7 8 91 44 72 55 83 66 9
output
7 8 9 4 5 6 1 2 3

把能够相互交换的位置放在一个数组a中,把这些位置上的数放在数组b中,a从小到大排序,b从大到小排序,把b中的数以此放在a中的位置上

#include <bits/stdc++.h>#define maxn 1000005using namespace std;typedef long long ll;vector<int> v[maxn];priority_queue<int> q1;priority_queue<int, vector<int>, greater<int> > q2;int vis[maxn], num[maxn];void dfs(int h){q1.push(num[h]);q2.push(h);vis[h] = 1;for(int i = 0; i < v[h].size(); i++){int d = v[h][i];if(vis[d] == 0){dfs(d);}} }int main(){//freopen("in.txt", "r", stdin);int n, mm, a, b;scanf("%d%d", &n, &mm);for(int i = 1; i <= n; i++) scanf("%d", num+i);for(int i = 0; i < mm; i++){scanf("%d%d", &a, &b);v[a].push_back(b);v[b].push_back(a);}for(int i = 1; i < n; i++){if(vis[i] == 1) continue;dfs(i);while(!q2.empty()){int k1 = q1.top();q1.pop();int k2 = q2.top();q2.pop();num[k2] = k1;}}printf("%d", num[1]);for(int i = 2; i <= n; i++) printf(" %d", num[i]);puts("");return 0;}



0 0