Cod sursa(job #1493759)

Utilizator CollermanAndrei Amariei Collerman Data 29 septembrie 2015 21:09:52
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
using namespace std;
ofstream fout("datorii.out");
ifstream fin("datorii.in");

const int NMAX = 15005;

int N, M, x, y;
int A[NMAX], Poz[NMAX], Arbore[NMAX * 2 + 5];

void init(int st, int dr, int nod)
{
    if(st == dr) {
        Arbore[nod] = A[st];
        Poz[st] = nod;
    }
    else {
        init(st, st + (dr - st) / 2, nod * 2);
        init(st + (dr - st) / 2 + 1, dr, nod * 2 + 1);
        Arbore[nod] = Arbore[nod * 2] + Arbore[nod * 2 + 1];
    }
}

int suma(int st, int dr, int nod)
{
    if(x <= st && dr <= y)
        return Arbore[nod];
    else {
        int suma1 = 0, suma2 = 0;
        int mij = st + (dr - st) / 2;

        if(x <= mij) suma1 = suma(st, mij, nod * 2);
        if(y > mij) suma2 = suma(mij + 1, dr, nod * 2 + 1);

        return suma1 + suma2;
    }
}

void adauga(int nod)
{
    if(nod > 0)
        Arbore[nod] -= y,
        adauga(nod / 2);
}

int main()
{
    fin >> N >> M;
    for(int i=1; i<=N; i++) fin >> A[i];

    init(1, N, 1);

    for(int i=1, op; i<=M; i++) {
        fin >> op >> x >> y;
        if(!op) adauga(Poz[x]);
        else fout << suma(1, N, 1) << '\n';
    }

    return 0;
}