Cod sursa(job #2421800)

Utilizator BurlacuMateiBurlacu Matei BurlacuMatei Data 16 mai 2019 10:28:58
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#define MAX 15010

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

int build(int nod, int st, int dr);
int Suma(int nod, int st, int dr, int a, int b);
void update(int nod, int st, int dr, int poz, int val);

int n, m;
int op, a, b;
int preturi[MAX], arb[4 * MAX];

int main()
{
    int i;
    fin >> n >> m;
    for(i=1;i<=n;i++)
        fin >> preturi[i];

    build(1, 1, n);
    for(i=1;i<=m;i++)
    {
        fin >> op >> a >> b;
        if(op == 1)
        {
            fout << Suma(1, 1, n, a, b) << '\n';
        }
        else
            update(1, 1, n, a, b);
    }

    return 0;
}

int build(int nod, int st, int dr)
{
    int s = 0;
    if(dr == st)
    {
        arb[nod] = preturi[dr];
        return arb[nod];
    }

    int mij = (st + dr) / 2;
    s += build(nod * 2, st, mij);
    s += build(nod * 2 + 1, mij + 1, dr);
    arb[nod] = s;
    return s;

}

int Suma(int nod, int st, int dr, int a, int b)
{
    if(st >= a && dr <= b)
        return arb[nod];
    if(dr < a || b < st) return 0;

    int s = 0;
    int mij = (st + dr) / 2;
    s += Suma(2 * nod, st, mij, a, b);
    s += Suma(2 * nod + 1, mij + 1, dr, a, b);
    return s;
}

void update(int nod, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        arb[nod] -= val;
        return;
    }

    int mij = (st + dr) / 2;
    if(poz <= mij)
        update(nod * 2, st, mij, poz, val);
    else
        update(nod * 2 + 1, mij + 1, dr, poz, val);
        arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}