프로그램 최적화
시간 제한2초메모리 제한256 MB
주어진 C++ 프로그램을 mt19937 난수열까지 그대로 재현하고, 최대 10^7번의 구간 mex 질의를 빠르게 처리해 최종 반환값을 구한다.
문제
다음 C++ 코드를 생각하자.
#include <algorithm>
#include <random>
int query_mex(const int *a, int l, int r);
int simulate(int n, int *a, int q, int k, int s) {
std::mt19937 gen;
gen.seed(s);
int last = 0;
while (q--) {
int op = gen() % k;
int i = (gen() + last) % n;
if (!op && i) {
std::swap(a[i - 1], a[i]);
} else {
int j = gen() % n;
last ^= query_mex(a, std::min(i, j), std::max(i, j));
}
}
return last;
}
이 프로그램에서 query_mex(a, l, r)은 에 등장하지 않는 최소 음이 아닌 정수를 반환한다.
, , , , 의 값이 주어질 때, 함수가 반환하는 값을 구하자.
입력
첫째 줄에 네 정수 , , , 가 주어진다. (, , , ) 둘째 줄에 개의 서로 다른 정수 이 주어진다. ()
출력
함수가 반환하는 값을 정수로 출력한다.