Cod sursa(job #2902890)

Utilizator alexdn6Dina Alexandru alexdn6 Data 16 mai 2022 21:56:36
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
vector <int > arb(60005);
void Actualizare(int radacina, int stanga, int dreapta, int pozitie, int valoare)
{
    if(stanga == dreapta) {
        arb[radacina] = valoare;
        return;
    }
    int mijloc = (stanga + dreapta)/2;
    if(pozitie <= mijloc)
        Actualizare(2 * radacina, stanga, mijloc, pozitie, valoare);
    else
        Actualizare(2 * radacina + 1, mijloc + 1, dreapta, pozitie, valoare);
    arb[radacina] = arb[2 * radacina] + arb[2 * radacina + 1];
}
void Actualizare2(int radacina, int stanga, int dreapta, int pozitie, int valoare)
{
    if(stanga == dreapta) {
        arb[radacina] -= valoare;
        return;
    }
    int mijloc = (stanga + dreapta)/2;
    if(pozitie <= mijloc)
        Actualizare(2 * radacina, stanga, mijloc, pozitie, valoare);
    else
        Actualizare(2 * radacina + 1, mijloc + 1, dreapta, pozitie, valoare);
    arb[radacina] = arb[2 * radacina] + arb[2 * radacina + 1];
}

int Interogare(int radacina, int stanga, int dreapta, int x, int y)
{
    if(x > dreapta || y < stanga)
        return 0;
    if(x <= stanga && dreapta <= y)
        return arb[radacina];
    return Interogare(2 * radacina, stanga, (stanga + dreapta) /2 , x, y) +
           Interogare(2 * radacina + 1, (stanga + dreapta) /2  + 1, dreapta, x, y);
}

int main()
{int n, m, x, y, val, i, op;
    f>>n>>m;
    for(i = 1; i <= n; i++)
    {
        f >> val;
        Actualizare(1, 1, n, i, val);
    }
    for(i = 1; i <= m; i++)
    {
        f >> op >> x >> y;
        if (!op)
            Actualizare2(1, 1, n, x, y);
        else
            g << Interogare(1, 1, n, x, y) << '\n';
    }
    return 0;
}