Cod sursa(job #2792057)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 31 octombrie 2021 19:46:39
Problema Datorii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <fstream>

using namespace std;

const int NMAX = 15000;
int v[1 + NMAX];
int aint[3 * NMAX];

void build(int index, int st, int dr)
{
    if (st == dr)
    {
        aint[index] = v[st];
        return;
    }

    int mij = (st + dr) / 2;
    int fiu_st = 2 * index;
    int fiu_dr = 2 * index + 1;

    build(fiu_st, st, mij);
    build(fiu_dr, mij + 1, dr);

    aint[index] = aint[fiu_st] + aint[fiu_dr];

    return;
}

int query(int index, int st, int dr, int qSt, int qDr)
{
    if (qSt == st && qDr == dr)
    {
        return aint[index];
    }

    int fiu_st = 2 * index;
    int fiu_dr = 2 * index + 1;
    int mij = (st + dr) / 2;

    if (qSt <= mij && qDr > mij)
    {
        return query(fiu_st, st, mij, qSt, mij) + query(fiu_dr, mij + 1, dr, mij + 1, qDr);
    }
    else if (qSt > mij)
    {
        return query(fiu_dr, mij + 1, dr, qSt, qDr);
    }
    else
    {
        return query(fiu_st, st, mij, qSt, qDr);
    }
}

void update(int index, int st, int dr, int zi, int val)
{
    if (st == dr)
    {
        aint[index] -= val;
        return;
    }

    int fiu_st = 2 * index;
    int fiu_dr = 2 * index + 1;
    int mij = (st + dr) / 2;

    if (zi > mij)
    {
        update(fiu_dr, mij + 1, dr, zi, val);
    }
    else
    {
        update(fiu_st, st, mij, zi, val);
    }

    aint[index] -= val;

    return;
}

int main()
{
    ifstream in("datorii.in");
    ofstream out("datorii.out");
    int n, m, qSt, qDr, zi, val;
    int cod;

    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        in >> v[i];
    }

    build(1, 1, n);

    for (int i = 1; i <= m; i++)
    {
        in >> cod;

        switch (cod)
        {
        case 1:
            in >> qSt >> qDr;
            out << query(1, 1, n, qSt, qDr) << '\n';
            break;
        case 0:
            in >> zi >> val;
            update(1, 1, n, zi, val);
        }
    }


    return 0;
}