Grade 9 · Frequency arrays, prefix sums and the Sieve of EratosthenesCitește în română
Prefix sums
Original: Sume parțiale
The idea
s[i] = v[1] + v[2] + ... + v[i], with s[0] = 0, is computed in a single pass: s[i] = s[i - 1] + v[i]. Then the sum over any range [st, dr] is s[dr] - s[st - 1], in O(1). n and the array are read, then q queries (st, dr), and the sum is printed for each.
Original description (Romanian)
s[i] = v[1] + v[2] + ... + v[i], cu s[0] = 0, se calculează într-o singură trecere: s[i] = s[i - 1] + v[i]. Apoi suma pe orice interval [st, dr] este s[dr] - s[st - 1], în O(1). Se citesc n, vectorul, apoi q întrebări (st, dr), iar pentru fiecare se afișează suma.
- Complexity
- O(n + q), compared with O(n · q) if we summed for every query
- Grade
- Grade 9 (Clasa a IX-a)
Examples
Input
5 2 4 1 3 5 3 1 3 2 5 4 4
Expected output
7 13 3
The code
Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.
/*
* Titlu: Sume parțiale
* Clasa: 9
* Capitol: Frecvență, sume parțiale și ciurul lui Eratostene
* Descriere: s[i] = v[1] + v[2] + ... + v[i], cu s[0] = 0, se calculează într-o
* singură trecere: s[i] = s[i - 1] + v[i]. Apoi suma pe orice interval
* [st, dr] este s[dr] - s[st - 1], în O(1). Se citesc n, vectorul,
* apoi q întrebări (st, dr), iar pentru fiecare se afișează suma.
* Complexitate: O(n + q), față de O(n · q) dacă am aduna la fiecare întrebare
*
* Exemplu
* Intrare:
* 5
* 2 4 1 3 5
* 3
* 1 3
* 2 5
* 4 4
* Ieșire:
* 7
* 13
* 3
*/
#include <iostream>
using namespace std;
long long s[100001];
int main()
{
int n, q, x;
cin >> n;
s[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> x;
s[i] = s[i - 1] + x;
}
cin >> q;
for (int k = 1; k <= q; k++)
{
int st, dr;
cin >> st >> dr;
cout << s[dr] - s[st - 1] << '\n';
}
return 0;
}
Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.