전국시대
면접 대비시간 제한1초메모리 제한128 MB
국가 그룹 간의 동맹과 전쟁 기록을 처리한다. 동맹은 병력을 합치고 전쟁은 강한 쪽이 약한 쪽을 흡수하며 남은 병력은 차이만큼이고, 마지막에 살아남은 그룹의 병력을 오름차순으로 출력한다.
문제
전국시대에는 개의 국가가 있다. 각 국가에는 부터 까지의 번호가 붙어 있으며, 각 국가는 자신의 힘을 나타내는 병력을 가지고 있다.
개의 기록이 순서대로 주어진다. 각 기록은 동맹과 전쟁 중 하나이다.
- 동맹: 두 국가가 동맹을 맺으면 두 국가가 속한 집단이 하나로 합쳐지고, 병력은 두 집단의 병력을 합한 값이 된다.
- 전쟁: 두 국가가 속한 집단이 전쟁을 벌이면 병력이 많은 쪽이 승리하고, 패배한 집단은 승리한 집단의 속국이 되어 하나로 합쳐진다. 이때 남은 병력은 승리한 집단의 병력에서 패배한 집단의 병력을 뺀 값이 된다. 두 집단의 병력이 같으면 두 집단이 모두 멸망한다.
모든 국가는 약속을 지키므로, 내 동맹의 동맹도 나의 동맹이며, 동맹 중 하나가 전쟁을 시작하면 같은 집단 전체가 함께 참전한다. 속국이 된 집단도 동맹과 같은 방식으로 취급되므로, 전쟁에서 진 집단과 같은 편이었던 모든 국가는 승리한 집단의 속국이 된다. 동맹이나 속국 관계로 묶인 여러 국가는 하나의 국가로 취급한다.
모든 기록이 끝났을 때 살아남은 국가의 수와 각 국가의 남은 병력을 구하는 프로그램을 작성하시오. 남은 병력은 오름차순으로 출력한다.
입력
첫째 줄에 국가의 수 과 기록의 수 이 주어진다. (, )
둘째 줄부터 개의 줄에 걸쳐 번째 국가의 병력 가 자연수로 주어진다. ()
다음 개의 줄에는 기록이 세 정수 , , 로 주어진다. 이면 와 가 동맹을 맺었음을 의미하고, 이면 와 가 전쟁을 벌였음을 의미한다. ()
이미 같은 집단에 속한 두 국가가 다시 동맹을 맺거나 전쟁을 벌이는 기록은 주어지지 않으며, 이미 멸망한 국가가 포함된 기록도 주어지지 않는다.
출력
첫째 줄에 살아남은 국가의 수를 출력한다.
살아남은 국가가 있으면 다음 줄에 각 국가의 남은 병력을 오름차순으로 공백으로 구분하여 출력한다. 살아남은 국가가 없으면 첫째 줄의 만 출력한다.