Cod sursa(job #2622294)

Utilizator lauratenderLaura Tender lauratender Data 31 mai 2020 20:40:28
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>

std::ifstream in ("datorii.in");
std::ofstream out ("datorii.out");

const int MAXN = 15000;
int aib[MAXN + 1]; //aib[i] = suma subsecventei din v cu capetele: [i - 2k + 1; i]
int N;                  // k numarul de 0-uri terminale din reprezentarea binara a lui i

int terminale(int x) // 2^k pentru x
{
    return x & (-x);
}
void Adauga(int zi, int val) // face v[zi] = val
{
    for (int i = zi; i <= N; i += terminale(i))
        aib[i] += val;
}
int Suma (int zi) // calculeaza suma v[1] + v[2] + ... + v[zi]
{
    int s = 0;
    for (int i = zi; i > 0; i -= terminale(i))
        s += aib[i];
    return s;
}

int main()
{
    int M, nr, op, q1, q2;
    in >> N >> M;
    for (int i = 1; i <= N; ++i){
        in >> nr;
        Adauga(i, nr); // adauga nr la ziua i
    }
    for (int i=0; i < M; i++)
    {
        in >> op >> q1 >> q2;
        if (op == 0)
            Adauga (q1, - q2); // scad q2 din ziua q1, scad q2 din suma de achitat
        if (op == 1)
            out <<  Suma(q2) - Suma(q1 - 1) << '\n'; // datoriile din zilele [q1, q2] = [1, q2] - [1, q1-1]
    }
    return 0;
}