랜덤 넘버 추측하기

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

요약
회원별 가중치와 M명의 당첨자 순서가 주어질 때, 이를 만들어낼 수 있는 응모권 번호 수열 X를 하나 복원한다.
난이도

어려움10점 중 9점

유형
세그먼트 트리, 이분 탐색, 누적 합, 시뮬레이션
정답자
아직 제출이 없습니다

문제

영과일에서 한 학기동안 문제를 열심히 푼 회원들을 추첨하여 상품을 지급하려고 한다.

각 회원들에겐 문제를 푼 개수만큼 추첨 확률을 높일 수 있는 가중치가 부여된다. 문제를 pp개 풀었다면 그 회원의 가중치는 pp이다.

한 학기 동안 문제를 푼 적이 있는 회원은 총 NN명이고, 그러한 회원들에게 11번부터 NN번까지의 고유 번호를 부여한다.

회원 NN명중에서 M(1≤M≤N)M(1 \leq M \leq N)명을 뽑으려고 할 때, i=1i=1부터 시작하여 다음과 같은 방식으로 추첨을 진행하려고 한다.

  1. 11번 회원부터 NN번 회원까지 번호 순서대로, 각 회원의 가중치만큼 응모권을 리스트 WW에 반복해서 넣는다. 예를 들어, 회원이 총 33명이고 각각의 가중치가 2, 1, 32,\ 1,\ 3 이라면 W=\[T_1, T_1, T_2, T_3, T_3, T_3]W = \[T\_1,\ T\_1,\ T\_2,\ T\_3,\ T\_3,\ T\_3]이다. (T_kT\_k는 kk번 회원의 응모권)
  2. 11부터 ∣W∣|W|까지의 정수 중 하나를 랜덤하게 선택하고, 이 수를 X_iX\_i라 하자.
  3. 리스트 WW의 앞에서부터 X_iX\_i번째에 해당하는 응모권을 선택해 당첨자 한 명을 뽑는다.
  4. 리스트 WW에서 방금 당첨된 회원의 응모권을 모두 제거한다.
  5. i≠Mi \neq M이면 ii를 11만큼 증가시킨 후 2번 과정으로 돌아가고, 그렇지 않다면 추첨을 종료한다.

위 방식을 통해 뽑힌 당첨자의 고유 번호가 순서대로 주어졌을 때, 랜덤하게 나온 수가 차례대로 무엇일지 추측하려고 한다.

입력

첫 번째 줄에 문제를 푼 회원수 NN과 당첨인원수 MM이 공백을 사이에 두고 주어진다. (1≤N≤500,000;1≤M≤N)(1 \leq N \leq 500\\,000; 1 \leq M \leq N)

두 번째 줄에 각 회원의 가중치 pp가 공백을 사이에 두고 NN개 주어진다. (1≤p≤1,000)(1 \leq p \leq 1\\,000)

세 번째 줄에 뽑힌 순서대로 회원의 번호 kk가 공백을 사이에 두고 MM개 주어진다. (1≤k≤N)(1 \leq k \leq N)

입력에서 주어지는 수는 모두 정수이다.

출력

추첨 과정을 통해 랜덤하게 나온 수열 XX를 공백을 사이에 두고 출력한다.

만약 가능한 수열이 여러 개라면 아무 수열이나 하나 출력한다.

예제1

  1. 예제 1

    입력
    5 3
    1 2 3 4 5
    3 5 1
    
    예상 출력
    5 9 1