Cod sursa(job #2924765)

Utilizator matei.tudoseMatei Tudose matei.tudose Data 10 octombrie 2022 12:49:19
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int n, m, nr_el_baza;
vector<int> values, graf;

void build_graph(int node, int lf, int rg)
{
    if (lf == rg && lf < n)
    {
        graf[node] = values[lf];
        return;
    }
    else if (lf == rg)
    {
        graf[node] = 0;
        return;
    }
    int med = (lf + rg) / 2;
    build_graph(2 * node, lf, med);
    build_graph(2 * node + 1, med + 1, rg);
    graf[node] = graf[2 * node] + graf[2 * node + 1];
}

void set_constant()
{
    int logar = log2(n);
    if ((1 << logar) < n)
        logar++;
    nr_el_baza = (1 << logar);
}

int query(int q_lf, int q_rg, int node = 1, int lf = 0, int rg = nr_el_baza - 1)
{
    int lfAns = 0, rgAns = 0;
    if (q_lf <= lf && rg <= q_rg)
        return graf[node];
    int med = (lf + rg) / 2;
    if (q_lf <= med)
        lfAns = query(q_lf, q_rg, 2 * node, lf, med);
    if (q_rg > med)
        rgAns = query(q_lf, q_rg, 2 * node + 1, med + 1, rg);
    return lfAns + rgAns;
}

void achitare(int val, int poz, int node = 1, int lf = 0, int rg = nr_el_baza - 1)
{
    if (lf == rg)
    {
        graf[node] -= val;
        return;
    }
    int med = (lf + rg) / 2;
    if (poz <= med)
        achitare(val, poz, 2 * node, lf, med);
    else
        achitare(val, poz, 2 * node + 1, med + 1, rg);
    graf[node] -= val;
}

int main()
{
    fin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        int val;
        fin >> val;
        values.push_back(val);
    }
    set_constant();
    graf.resize(2 * nr_el_baza);
    build_graph(1, 0, nr_el_baza - 1);
    for (int i = 0; i < n; i++)
    {
        int op, t, v, p, q;
        fin >> op;
        if (op == 0)
        {
            fin >> t >> v;
            t--;
            achitare(v, t);
        }
        else
        {
            fin >> p >> q;
            p--;
            q--;
            fout << query(p, q) << "\n";
        }
    }
    return 0;
}