Cod sursa(job #2792052)

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

using namespace std;

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

const int NMAX = 15000;

int aint[1+4*NMAX];

int v[1 + NMAX];

void build (int indexNod, int st, int dr)
{
    if (st == dr)
    {
        aint[indexNod] = v[st];
        return;
    }
    int indexFiuSt = 2 * indexNod;
    int indexFiuDr = 2 * indexNod + 1;
    int mij = (st+ dr) / 2;

    build(indexFiuSt, st, mij);
    build(indexFiuDr, mij+1 , dr);

    aint[indexNod] = aint[indexFiuSt] + aint[indexFiuDr];
}
void update(int indexNod, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        aint[indexNod] -= val;
        return;
    }
    int indexFiuSt = 2 * indexNod;
    int indexFiuDr = 2 * indexNod + 1;
    int mij = (st + dr)/2;

    if(poz <= mij)
        update(indexFiuSt, st, mij, poz, val);
    else
        update(indexFiuDr, mij + 1, dr, poz, val);
    aint[indexNod] -= val;
}
int query(int indexNod, int st, int dr, int stQuery, int drQuery)
{
    if( stQuery == st && drQuery == dr)
    {
        return aint[indexNod];
    }
    int indexFiuSt = 2 * indexNod;
    int indexFiuDr = 2 * indexNod + 1;
    int mij = (st + dr)/2;

    if (drQuery <= mij)
        return query(indexFiuSt, st, mij, stQuery, drQuery);
    else if(stQuery >= mij + 1)
        return query(indexFiuDr, mij + 1, dr, stQuery, drQuery);
        else
        return query(indexFiuSt, st, mij, stQuery, mij) + query(indexFiuDr, mij + 1, dr, mij + 1, drQuery);
}

int main()
{
    int n, m;
    in >> n >> m;
    for(int i = 1; i<= n; i++)
    {
        in >> v[i];
    }
    build(1,1,n);
    for( int j = 1; j <= m; j++)
    {
        int tipOperatie, a, b;
        in >> tipOperatie >> a >> b;
        if (tipOperatie == 0)
        {
            update(1, 1, n, a, b);
        }
        else
        {
            out << query(1, 1, n, a, b) << '\n';
        }
    }
    return 0;
}