Module: 접두사 합계


Problem

1 /8


라인의 금액

Theory Click to read/hide

약간의 배열이 있습니다. 변경 사항이 없으면 이 배열의 하위 세그먼트에서 일부 함수의 값을 빠르게(한 줄보다 빠르게) 찾을 수 있습니다. 이를 위해서는 추가 메모리를 사용하고 사전 계산을 수행해야 합니다.
예를 들어 배열의 일부 세그먼트에서 합계를 빠르게 찾아야 합니다.
인덱스 i가 i보다 작거나 같은 인덱스를 가진 배열의 모든 요소의 합이 되는 접두사 합계의 배열을 얻습니다.
a[] – 주어진 배열, p[] – 접두사 합계의 배열


어레이 카운트 p:
분명히 p[0] = a[0]입니다. p[i – 를 통해 p[i]를 쉽게 다시 계산할 수 있습니다. 1] 때문에 i 접두사의 금액은 i 접두사의 금액 – 1 + a[i].
따라서 접두사 합계를 계산하는 코드는 다음과 같습니다.

정수 a[n], p[n];
p[0] = a[0< /스팬>];
for (int i = 1; i < n; i++)
         p[i] = p[i -  1] + a[i];

또한 세그먼트의 합계 – 접두사에 있는 두 합계의 차이.


녹색 = 빨간색 - 파란색
따라서 구간 [l,r]에서 합을 구해야 하는 경우 답은 p[r] – p[l-1].
그러나 l – 1개의 요소가 존재하지 않을 수 있습니다. if's 없이 하기 위해서는 1-인덱싱을 입력하면 a[0]과 p[0]은 중립적인 값을 갖게 됩니다(합계는 0).
 
이 기법은 포함-배제 공식의 특수한 경우이므로 이러한 방식으로 합계뿐만 아니라 곱셈 및 xor와 같은 다른 함수도 저장할 수 있습니다.
 

Problem

길이가 n인 불변 배열과 “l에서 까지의 배열 하위 세그먼트의 합계 계산과 같은 쿼리가 q인 경우 r ”. 각 요청에 대한 답변을 인쇄합니다.
<사업부>
입력
첫 번째 줄에는 숫자 n이 포함됩니다. 배열 크기(\(1 <= n <= 10^5\)). 두 번째 줄에는 n &ndash 숫자가 포함됩니다. ; 배열 요소. 모듈로 숫자는 \(10^9\)를 초과하지 않습니다. 세 번째 줄에는 숫자 q – 요청 수(\(1 <= q <= 10^5\)). 다음에 q줄, 각각 여기에는 2개의 숫자가 포함됩니다: lr (\(1 <= l <= r <= n\ )).
<사업부>
출력
각각 별도의 줄에 모든 쿼리에 대한 답변을 인쇄합니다.
 

 

<헤드> <일># <몸>
입력 출력
1
5
1 2 3 4 5
<사업부>3 <디브>1 2
3 3
2 5
3
3
14