아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

Or 머신

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

요약
비트 OR 대입 연산으로 이루어진 순환 프로그램을 최대 1e18번 수행한 뒤 각 레지스터의 최종 값을 출력한다.
난이도

보통10점 중 7점

유형
그래프, 비트 연산, 이분 탐색, 시뮬레이션
정답자
아직 제출이 없습니다

문제

우리는 C++의 | 연산 하나만을 위해 극도로 최적화한 컴퓨터인 Or 머신을 개발하고 있다.

Or 머신에는 nn개의 레지스터가 있고, 각 레지스터에는 282^8 미만의 음이 아닌 정수가 들어 있다. 레지스터를 x1,x2,⋯ ,xnx_1, x_2, \cdots, x_n이라 하자. 프로그램은 ll개의 연산 목록으로 표현된다. 각 연산은 정수 쌍 (a,b)(a, b)로 표현되며, 이는 xax_a를 xax_a와 xbx_b의 비트 OR로 갱신하라는 뜻이다.

Or 머신은 프로그램, 레지스터의 초기값, 양의 정수 tt를 받는다. 실행하면 프로그램의 각 연산을 차례대로 하나씩 수행한다. 마지막 연산을 수행하면 다시 첫 번째 연산으로 돌아가 이 과정을 반복한다. 머신은 정확히 tt개의 연산을 수행한 뒤 멈춘다.

우리는 이 머신이 범용 컴퓨터보다 훨씬 빠르길 바라지만, 하드웨어 최적화만으로는 부족할 듯하다. 소프트웨어 최적화를 도와줄 수 있는가?

입력

첫째 줄에 세 정수 nn, ll, tt가 주어진다. (1≤n,l≤2181 \leq n, l \leq 2^{18}, 1≤t≤10181 \leq t \leq 10^{18}) ll은 프로그램의 길이이다.

다음 ll개의 줄에 프로그램이 주어진다. 각 줄에는 해당 연산에 참여하는 레지스터 쌍을 나타내는 두 정수 aa, bb가 주어진다. (1≤a,b≤n1 \leq a, b \leq n)

마지막 줄에는 레지스터의 초기값 x1,⋯ ,xnx_1, \cdots, x_n이 nn개의 정수로 주어진다. (0≤xi<280 \le x_i < 2^8)

출력

tt개의 연산을 수행한 뒤의 레지스터 값 x1,⋯ ,xnx_1, \cdots, x_n을 한 줄에 nn개의 정수로 출력한다.

예제1

  1. 예제 1

    입력
    5 4 5
    1 2
    2 3
    2 4
    4 4
    8 0 5 3 10
    
    예상 출력
    15 7 5 3 10