Educational Codeforces Round 14

来源:互联网 发布:php大转盘抽奖源码 编辑:程序博客网 时间:2024/06/05 10:18

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


POINT:

并差集合并,开maxn个优先队列,在贪心的放置就行。


#include <string>#include <string.h>#include <iostream>#include <queue>#include <math.h>#include <stdio.h>#include <algorithm>using namespace std;#define LL long longconst int maxn = 1e6+55;priority_queue<int> q[maxn];int a[maxn];int fa[maxn];int findi(int x){return x==fa[x]?fa[x]:fa[x]=findi(fa[x]);}void add(int x,int y){int xx=findi(x);int yy=findi(y);fa[yy]=xx;}int main(){int n,m;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);fa[i]=i;}for(int i=1;i<=m;i++){int u,v;scanf("%d %d",&u,&v);add(u,v);}for(int i=1;i<=n;i++){q[findi(i)].push(a[i]);}for(int i=1;i<=n;i++){printf("%d ",q[fa[i]].top());q[fa[i]].pop();}return 0;}