한 자리 숫자 d의 색을 빨강부터 차례대로 0,1,2,3,4로 번호 매기고 상태를 0,1로 나타내자. 다음 대응 f를 사용한다.
(f(0),f(1),⋯,f(9))=(0,5,6,1,2,7,8,3,4,9).
f(d)는 다음 두 조건을 만족하는 0 이상 9 이하의 유일한 정수이다.
f(d)mod5는 d의 색 번호이다.
f(d)mod2는 d의 상태이다.
색의 합성은 색 번호의 덧셈 modulo 5이고, 상태의 XOR은 덧셈 modulo 2와 같다. 중국인의 나머지 정리에 의해
f(x⋄y)≡f(x)+f(y)(mod10)
이 성립한다.
Ai의 10j 자리 숫자를 dj(Ai)라고 하자. 자리별 누적합을
Sij=k=1∑if(dj(Ak))(mod10),S0j=0
으로 정의한다. 그러면 구간 [l,r]의 10j 자리 결과가 0인 것과 Sl−1j=Srj인 것은 동치이다.
전체 결과가 0이려면 모든 십진 자리에서 동시에 이 조건을 만족해야 한다. 0≤Ai≤1018이므로 필요한 자리는 j=0,1,⋯,18의 19개뿐이다. 따라서
Si=(Si0,Si1,⋯,Si18)
라고 두면, 구간 [l,r]의 이상한 십진법 XOR가 0인 것과 Sl−1=Sr인 것은 동치이다.
서브태스크 1
Ai≤9이면 일의 자리만 0이 아닐 수 있다. 따라서 Si는 사실상 modulo 10 값 하나뿐이다. 각 값 0,1,⋯,9에 대해 누적 등장 횟수를 저장하면, 쿼리 [L,R]에서는 접두사 위치 L−1,L,⋯,R에 각 값이 몇 번 등장하는지 O(1)에 구할 수 있다. 어떤 값이 c번 등장하면 같은 값을 고르는 위치 쌍은 (2c)개이므로 한 쿼리를 O(10)에 처리할 수 있다.
시간 복잡도는 O(N+10Q)이고 공간 복잡도는 O(10N)이다.
전체 제약
이제 Si는 길이 19인 벡터이고 가능한 값의 전체 공간은 너무 크다. 하지만 실제로 등장하는 벡터는 S0,S1,⋯,SN뿐이다. 이 벡터들을 사전순으로 정렬하여 같은 벡터에 같은 정수 ID를 부여한다.
그러면 각 쿼리 [L,R]은 접두사 위치 구간 [L−1,R] 안에서 값이 같은 서로 다른 두 위치의 쌍의 개수를 묻는 문제가 된다.
이를 Mo's algorithm으로 오프라인 처리한다. 현재 구간에 ID v가 c개 들어 있을 때 새 원소 v를 추가하면 답이 c 증가한다. 원소 v를 제거할 때는 먼저 개수를 하나 줄인 뒤 남은 개수만큼 답을 감소시키면 된다.
벡터 생성은 O(19N), 좌표 압축은 O(19NlogN), Mo's algorithm은 O((N+Q)N)에 동작한다. 따라서 전체 시간 복잡도는