목성의 공격!

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

요약
배열에서 한 원소를 갱신하고 부분 배열의 다항식 해시 값을 소수로 나눈 나머지로 구하는 질의를 처리한다.
난이도

보통10점 중 7점

유형
세그먼트 트리, 누적 합, 수학, 구현
정답자
아직 제출이 없습니다

문제

목성이 침공한다! 목성인의 우주선이 주요 도시들을 파괴했고, 인류는 반격에 나섰다. Nlogonia는 우주선의 제어 시스템을 해킹하여 반격을 주도하고 있다. 지구의 컴퓨터에서는 보통 한 바이트가 282^8개의 값을 가지지만, 목성의 컴퓨터는 한 바이트가 BB개의 값 {0,1,…,B−1}\{0, 1, \dots, B-1\}을 가진다. Nlogonia의 소프트웨어 엔지니어들은 목성 우주선의 펌웨어를 역공학으로 분석했고, 우주선이 결국 자폭하도록 펌웨어를 조작하려 한다.

그러나 보안 장치로서, 각 목성 우주선은 펌웨어의 일부를 해싱하여 그 결과를 알려진 정상 값과 비교함으로써 주기적으로 펌웨어의 무결성을 검사하는 감시 프로그램을 실행한다. 위치 ii의 바이트부터 위치 jj의 바이트까지 펌웨어의 일부를 해싱하기 위해, 감시 프로그램은 다음 해시 함수를 사용한다.

H(fi,…,fj)=(∑k=0j−iBkfj−k) mod PH(f_i, \dots, f_j) = \left(\sum_{k=0}^{j-i} B^k f_{j-k}\right) \bmod P

여기서 PP는 소수이다. 예를 들어 B=20B = 20, P=139P = 139이고 펌웨어의 22번부터 55번 바이트의 값이 f2=14f_2 = 14, f3=2f_3 = 2, f4=2f_4 = 2, f5=4f_5 = 4라면,

H(f2,…,f5)=B0f5+B1f4+B2f3+B3f2(modP)=200⋅4+201⋅2+202⋅2+203⋅14(mod139)=4+40+800+112000(mod139)=112844(mod139)=115.\begin{aligned} H(f_2, \dots, f_5) &= B^0 f_5 + B^1 f_4 + B^2 f_3 + B^3 f_2 \pmod P \\ &= 20^0 \cdot 4 + 20^1 \cdot 2 + 20^2 \cdot 2 + 20^3 \cdot 14 \pmod{139} \\ &= 4 + 40 + 800 + 112000 \pmod{139} \\ &= 112844 \pmod{139} \\ &= 115. \end{aligned}

Nlogonia의 암호학자들은 감시 프로그램을 건드리지 않고 펌웨어를 조작할 방법을 찾아야 한다. 그 첫 단계로, 당신은 두 종류의 명령이 섞여 있는 과정을 시뮬레이션하는 프로그램을 작성해야 한다. 하나는 (Nlogonia 엔지니어들이) 펌웨어의 바이트를 수정하는 명령이고, 다른 하나는 (목성 감시 프로그램이) 펌웨어 일부의 해시를 계산하는 명령이다. 시뮬레이션 시작 시 펌웨어의 모든 바이트 값은 00이다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 네 정수 BB, PP, LL, NN이 주어진다. BB는 목성 바이트가 가질 수 있는 값의 개수, PP는 목성 해시의 법(modulus, 2≤B<P≤1092 \le B < P \le 10^9이며 PP는 소수), LL은 펌웨어의 길이(목성 바이트 개수), NN은 시뮬레이션할 명령의 개수이다(1≤L,N≤1051 \le L, N \le 10^5). 각 테스트 케이스가 시작될 때 모든 바이트는 1≤i≤L1 \le i \le L에 대해 fi=0f_i = 0이다.

이어지는 NN개의 줄은 각각 하나의 명령을 나타낸다. 모든 명령은 대문자 E 또는 H로 시작한다.

  • E — 수정 명령이며, 뒤에 두 정수 II와 VV가 온다. 위치 II의 바이트(fIf_I)를 값 VV로 설정한다(1≤I≤L1 \le I \le L, 0≤V≤B−10 \le V \le B-1).
  • H — 해시 명령이며, 뒤에 두 정수 II와 JJ가 온다. H(fI,…,fJ)H(f_I, \dots, f_J)를 계산한다(1≤I≤J≤L1 \le I \le J \le L).

입력의 마지막에는 0 0 0 0으로 이루어진 줄이 오며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스에 대해, 모든 해시 명령의 결과를 순서대로 출력한다. ii번째 줄에는 ii번째 해시 명령의 결과인 정수를 출력한다. 각 테스트 케이스 뒤에는 하이픈 문자 하나(-)만 있는 줄을 출력한다.

예제1

  1. 예제 1

    입력
    20 139 5 7
    E 1 12
    E 2 14
    E 3 2
    E 4 2
    E 5 4
    H 2 5
    E 2 14
    10 1000003 6 11
    E 1 3
    E 2 4
    E 3 5
    E 4 6
    E 5 7
    E 6 8
    H 1 6
    E 3 0
    E 3 9
    H 1 3
    H 4 6
    999999935 999999937 100000 7
    E 100000 6
    E 1 7
    H 1 100000
    E 50000 8
    H 1 100000
    H 25000 75000
    H 23987 23987
    0 0 0 0
    
    예상 출력
    115
    -
    345678
    349
    678
    -
    824973478
    236724326
    450867806
    0
    -