Module: Somas de prefixo


Problem

1 /8


A quantia na linha

Theory Click to read/hide

Que haja alguma matriz. Na ausência de mudanças, podemos encontrar rapidamente (mais rápido que uma linha) o valor de algumas funções em um subsegmento dessa matriz. Para fazer isso, precisamos usar memória adicional e fazer um pré-cálculo.
Por exemplo, precisamos encontrar rapidamente a soma em algum segmento do array.
Vamos obter um array de somas de prefixos, em que o índice i será a soma de todos os elementos do array com índices menores ou iguais a i.
a[] – dada matriz, p[] – matriz de somas de prefixos


Contagem de array p:
Obviamente p[0] = a[0]. Observe que podemos facilmente recalcular p[i] por meio de p[i – 1], porque o valor no prefixo i é o valor no prefixo i – 1 + a[i].
Assim, o código para calcular as somas de prefixos fica assim:

int a[n], p[n];
p[0] = a[0< /extensão>];
para (int i = 1; i < n; i++)
         p[i] = p[i -  1] + a[i];

Além disso, notamos que a soma no segmento – a diferença entre as duas somas no prefixo.


Verde = vermelho – azul
Assim, se for necessário encontrar a soma no intervalo [l,r], então a resposta é p[r] – p[l-1].
No entanto, se l – 1 elemento pode não existir. Para fazer sem if's, você pode inserir 1-indexing, e a[0] e p[0] terão valores neutros (0 para a soma).
 
Observe que esta técnica é um caso especial da fórmula de inclusão-exclusão, portanto, desta forma é possível armazenar não apenas somas, mas também outras funções, como multiplicação e xor.
 

Problem

Dado um array imutável de comprimento n e consultas q como “calcular a soma de um subsegmento de array de l a r ”. Imprima a resposta para cada solicitação.

Entrada
A primeira linha contém um número n – tamanho da matriz (\(1 <= n <= 10^5\)). A segunda linha contém n &ndash números ; elementos da matriz. Os números do módulo não excedem \(10^9\). A terceira linha contém o número q – número de solicitações (\(1 <= q <= 10^5\)). Seguido por q linhas, cada dos quais contém 2 números: l e r (\(1 <= l <= r <= n\ )).

Saída
Imprima as respostas para todas as consultas, cada uma em uma linha separada.
 

 

Exemplos
# Entrada Saída
1
5
1 2 3 4 5
3
1 2
3 3
2 5
3
3
14