허용된 교환으로 정렬하기

순열과 허용된 교환 쌍이 주어질 때, 주어진 쌍으로 정렬할 수 있는지 판정하고, 신장 포레스트에서 잎 제거 규칙이 만들어 내는 교환 순서를 출력한다.

보통7그래프DFS유니온 파인드시뮬레이션아직 제출이 없습니다시간 제한0.5초메모리 제한128 MB

문제

1부터 NN까지의 수가 한 번씩 나오는 순열이 주어진다.

또 위치 쌍 (a,b)(a, b)QQ개 주어진다. 각 쌍은 aa번 위치의 수와 bb번 위치의 수를 교환할 수 있다는 뜻이고, 같은 쌍을 여러 번 사용해도 된다.

허용된 교환만 사용해 순열을 오름차순으로 정렬할 수 있는지 판정하고, 정렬할 수 있으면 출력 규칙이 정하는 교환 순서를 출력한다. 교환은 500000번을 넘게 사용할 수 없다.

입력

첫째 줄에 순열의 길이 NN (1N10001 \le N \le 1000)이 주어진다.

둘째 줄에 1 이상 NN 이하의 서로 다른 정수 NN개가 순열을 이루어 주어진다.

셋째 줄에 허용된 교환의 개수 QQ (1Q2000001 \le Q \le 200000)가 주어진다.

이어지는 QQ개 줄에 교환이 허용된 두 위치 aabb가 주어진다. 두 수는 1 이상 NN 이하이고 서로 다르다. 같은 쌍이 여러 번 주어지기도 하고, 두 수의 순서가 바뀌어 주어지기도 한다.

출력

허용된 교환으로 순열을 정렬할 수 없으면 첫째 줄에 NEMOGUCE를 출력한다.

정렬할 수 있으면 다음 규칙이 만드는 교환을 만들어진 순서대로 한 줄에 하나씩 출력한다. 순열을 정렬하는 방법은 보통 여러 가지이므로 이 규칙이 만드는 교환 순서만 정답으로 인정한다.

  1. 위치 1부터 NN까지를 정점으로, 입력에 주어진 쌍을 간선으로 하는 그래프를 생각한다. 간선을 입력에 주어진 순서대로 살펴보면서 두 끝점이 아직 연결되지 않았으면 그 간선을 숲 FF에 넣고, 이미 연결되어 있으면 버린다. 그러면 FF는 각 연결 요소의 신장 트리로 이루어진다.
  2. 남은 위치의 집합 SS{1,2,,N}\{1, 2, \dots, N\}으로 둔다. SS가 빌 때까지 다음을 반복한다.
    1. SS에 속한 정점 가운데 FF에서 SS에 속한 이웃이 1개 이하인 정점을 모으고, 그중 번호가 가장 작은 정점을 uu라고 한다. 이런 정점은 항상 있다.
    2. 위치 uu에 값 uu가 없으면, 값 uu가 놓인 위치를 pp라고 한다. SS에 속한 정점만 남긴 FF에서 ppuu를 잇는 경로는 유일하다. 이 경로를 pp에서 uu 쪽으로 따라가며 경로 위에서 이웃한 두 위치의 값을 차례로 교환하고, 교환할 때마다 그 두 위치를 출력한다.
    3. SS에서 uu를 뺀다.
  3. 교환 한 번을 한 줄에 출력하고, 한 줄에는 교환한 두 위치를 작은 값, 큰 값 순서로 공백 하나를 사이에 두고 쓴다. 교환이 한 번도 필요하지 않으면 아무것도 출력하지 않는다.

이 규칙은 교환을 최대 N(N1)/2N(N-1)/2번 사용하므로 교환 횟수는 항상 500000 이하다.