빚 정산하기

시간 제한1초메모리 제한128 MB

요약
각 사람의 잔액과 친구 관계 그래프가 주어질 때, 연결 요소 안에서만 돈을 옮겨 모든 빚을 정산할 수 있는지 판정한다.
난이도

보통10점 중 4점

유형
유니온 파인드, 그래프, 그리디
정답자
아직 제출이 없습니다

문제

친한 친구들이 함께 풍경이 아름다운 나라 몰바니아로 여행을 떠났습니다. 여행 도중 여러 사건이 벌어졌고, 결국 마지막 날 밤에는 서로 "다시는 보고 싶지 않아!"라는 말을 주고받으며 여행이 끝나고 말았습니다.

집으로 돌아온 뒤, 이제는 사이가 틀어진 친구들은 여행 중에 쓴 비용을 공평하게 나누지 않았다는 사실을 깨달았습니다. 어떤 사람은 수천 크로나를 더 냈을 수도 있습니다. 그런데 정산이 생각보다 까다롭습니다. 많은 사람이 더 이상 서로 말을 섞으려 하지 않고, 돈을 주고받는 것은 더더욱 꺼리기 때문입니다.

당신은 이들을 돕기 위해 각 사람에게 자신이 얼마를 갚아야 하는지(또는 돌려받아야 하는지)와 아직 누구와 친구로 남아 있는지를 물어보았습니다. 이 정보만으로, 아직 친구로 남아 있는 사람들끼리만 돈을 주고받아서 모든 사람이 빚을 정확히 청산할 수 있는지 판단하려고 합니다. 돈은 친구 사이에서만 오갈 수 있지만, 친구를 거쳐 여러 사람에게 전달될 수는 있습니다.

입력

첫째 줄에 두 정수 nn (2≤n≤100002 \le n \le 10000)과 mm (0≤m≤500000 \le m \le 50000)이 주어집니다. nn은 친구의 수, mm은 아직 남아 있는 친구 관계의 수입니다.

이어지는 nn개의 줄에는 각각 정수 oo (−10000≤o≤10000-10000 \le o \le 10000)가 주어지며, ii번째 줄은 ii번 사람이 갚아야 할 금액을 나타냅니다. o<0o < 0이면 그만큼 돌려받아야 함을 뜻합니다. 이 값들의 합은 항상 00입니다.

그다음 mm개의 줄에는 각각 두 정수 xx, yy (0≤x<y≤n−10 \le x < y \le n-1)가 주어지며, xx번 사람과 yy번 사람이 아직 친구 사이임을 나타냅니다.

출력

모든 사람이 빚을 청산할 수 있으면 "POSSIBLE"을, 그렇지 않으면 "IMPOSSIBLE"을 한 줄에 출력합니다.

예제2

  1. 예제 1

    입력
    5 3
    100
    -75
    -25
    -42
    42
    0 1
    1 2
    3 4
    
    예상 출력
    POSSIBLE
    
  2. 예제 2

    입력
    4 2
    15
    20
    -10
    -25
    0 2
    1 3
    
    예상 출력
    IMPOSSIBLE