Moloco의 Vitcoin 추첨 (어려움)

각 티켓 i를 뽑으면 상금을 받고 확률 p_i로 계속, 1-p_i로 종료될 때, 기대 상금 합을 최대로 하는 순서를 구하고 동률이면 사전순으로 가장 앞선 순열을 출력한다.

보통7그리디정렬수학확률아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

월말이 되면 Moloco 직원들은 사내 복지 혜택을 걸고 간단한 추첨을 한다.

당신은 Moloco의 소중한 직원이라 추첨권 nn장을 받았다. 추첨권 ii의 상금은 wi>0w_i > 0 Vitcoin이다.

추첨권 ii에는 동전이 하나씩 짝지어져 있다. 이 동전은 확률 pip_i로 앞면이 나오고 확률 1pi1 - p_i로 뒷면이 나온다 (0<pi<10 < p_i < 1). 모든 동전 던지기는 서로 독립이다.

각 단계에서 아직 고르지 않은 추첨권을 하나 골라 상금을 즉시 받는다. 그다음 그 추첨권과 짝지어진 동전을 던진다. 앞면이 나오면 추첨이 이어져서 다음 추첨권을 고를 수 있고, 추첨권이 떨어질 때까지 이 과정을 반복한다. 뒷면이 나오면 추첨은 그 자리에서 끝나고, 그때까지 모은 Vitcoin을 모두 가진다.

모든 wiw_ipip_i를 알고 있다. 받는 Vitcoin의 기댓값을 최대로 만드는 추첨권 선택 순서를 구하라.

입력

첫째 줄에 정수 nn이 주어진다 (1n10000001 \le n \le 1\,000\,000).

다음 nn개 줄에는 각각 두 정수 wiw_iqiq_i가 주어진다 (1wi100001 \le w_i \le 10\,000, 0<qi<100000 < q_i < 10\,000). 확률은 pi=qi/10000p_i = q_i / 10000이다.

출력

추첨권을 고르는 순서를 나타내는 길이 nn의 순열을 한 줄에 공백으로 구분해 출력한다. 순열의 원소는 11 이상 nn 이하의 정수다.

기댓값을 최대로 만드는 순열이 여러 개면 사전순으로 가장 앞서는 것을 출력한다.

힌트

순서 σ1,σ2,,σn\sigma_1, \sigma_2, \dots, \sigma_n으로 고를 때 받는 Vitcoin의 기댓값은 k=1nwσkj<kpσj\sum_{k=1}^{n} w_{\sigma_k} \prod_{j < k} p_{\sigma_j}이다.

첫 번째 예제에서 순서 (1,2,3)(1, 2, 3)의 기댓값은 4.554.55이고, 기댓값이 가장 큰 순서는 8.78.7을 주는 (2,3,1)(2, 3, 1)이다. 세 번째 예제에서는 순서 (2,3,1)(2, 3, 1)(3,2,1)(3, 2, 1)의 기댓값이 같지만 (2,3,1)(2, 3, 1)이 사전순으로 앞선다.