Differencia
시간 제한14초메모리 제한256 MB
두 수열 a, b에서 구간의 a값을 x로 바꾸거나, 구간에서 a_i가 b_i 이상인 위치의 개수를 세는 연산 m개를 처리합니다.
문제
Zhang 교수는 길이가 인 두 수열 과 을 가지고 있다. 그는 이 수열에 두 종류의 연산을 수행하려고 한다.
- "+ ": 모든 인 를 로 바꾼다.
- "? ": 이고 인 의 개수를 구한다.
연산 횟수가 매우 클 수 있으므로, 개의 연산은 매개변수 와 를 아래 생성기 루틴에 넣어 지정한다.
int a = A, b = B, C = (1<<31), M = (1<<16)-1;
int rnd(int last) {
a = (36969 + (last >> 3)) * (a & M) + (a >> 16);
b = (18000 + (last >> 3)) * (b & M) + (b >> 16);
return (C & ((a << 16) + b)) % 1000000000;
}
번째 연산에서는 먼저 rnd(last)를 세 번 호출해 , , 를 얻는다. , , 이다. 이면 두 값을 서로 바꾼다. 가 짝수이면 "?" 연산, 홀수이면 "+" 연산이다. 여기서 는 가장 최근 "?" 연산의 답이며, 각 테스트 케이스가 시작될 때 이다.
입력
테스트 케이스가 여러 개 주어진다. 첫 줄에는 테스트 케이스의 수 가 주어진다. 각 테스트 케이스의 첫 줄에는 네 정수 , , , (, , )가 주어진다. 둘째 줄에는 개의 정수 ()이, 셋째 줄에는 개의 정수 ()이 주어진다.
테스트 케이스는 최대 개이며, 전체 입력 크기는 최대 MiB이다.
출력
각 테스트 케이스마다 정수 을 출력한다. 여기서 는 번째 "?" 질의의 답이다. 번째 연산이 "+" 연산이면 이다.