만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Differencia

시간 제한14초메모리 제한256 MB

요약
두 수열 a, b에서 구간의 a값을 x로 바꾸거나, 구간에서 a_i가 b_i 이상인 위치의 개수를 세는 연산 m개를 처리합니다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 이분 탐색, 정렬, 구현
정답자
아직 제출이 없습니다

문제

Zhang 교수는 길이가 nn인 두 수열 a1,a2,…,ana_1, a_2, \ldots, a_n과 b1,b2,…,bnb_1, b_2, \ldots, b_n을 가지고 있다. 그는 이 수열에 두 종류의 연산을 수행하려고 한다.

  • "+ ll rr xx": 모든 l≤i≤rl \le i \le r인 aia_i를 xx로 바꾼다.
  • "? ll rr": ai≥bia_i \ge b_i이고 l≤i≤rl \le i \le r인 ii의 개수를 구한다.

연산 횟수가 매우 클 수 있으므로, mm개의 연산은 매개변수 AA와 BB를 아래 생성기 루틴에 넣어 지정한다.

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;
}

ii번째 연산에서는 먼저 rnd(last)를 세 번 호출해 ll, rr, xx를 얻는다. l=rnd(last) mod n+1l = \text{rnd}(last) \bmod n + 1, r=rnd(last) mod n+1r = \text{rnd}(last) \bmod n + 1, x=rnd(last)+1x = \text{rnd}(last) + 1이다. l>rl > r이면 두 값을 서로 바꾼다. l+r+xl + r + x가 짝수이면 "?" 연산, 홀수이면 "+" 연산이다. 여기서 lastlast는 가장 최근 "?" 연산의 답이며, 각 테스트 케이스가 시작될 때 last=0last = 0이다.

입력

테스트 케이스가 여러 개 주어진다. 첫 줄에는 테스트 케이스의 수 TT가 주어진다. 각 테스트 케이스의 첫 줄에는 네 정수 nn, mm, AA, BB (1≤n≤1051 \le n \le 10^{5}, 1≤m≤3 000 0001 \le m \le 3\,000\,000, 1≤A,B≤2161 \le A, B \le 2^{16})가 주어진다. 둘째 줄에는 nn개의 정수 a1,a2,…,ana_1, a_2, \ldots, a_n (1≤ai≤1091 \le a_i \le 10^{9})이, 셋째 줄에는 nn개의 정수 b1,b2,…,bnb_1, b_2, \ldots, b_n (1≤bi≤1091 \le b_i \le 10^{9})이 주어진다.

테스트 케이스는 최대 300300개이며, 전체 입력 크기는 최대 88 MiB이다.

출력

각 테스트 케이스마다 정수 S=(∑i=1mi⋅zi) mod (109+7)S = \left(\sum_{i=1}^{m} i \cdot z_i\right) \bmod (10^9 + 7)을 출력한다. 여기서 ziz_i는 ii번째 "?" 질의의 답이다. ii번째 연산이 "+" 연산이면 zi=0z_i = 0이다.

예제1

  1. 예제 1

    입력
    3
    5 10 1 2
    5 4 3 2 1
    1 2 3 4 5
    5 10 3 4
    5 4 4 2 1
    1 2 3 4 5
    5 10 5 6
    5 4 5 2 1
    1 2 2 4 5
    
    예상 출력
    81
    88
    87