Cod sursa(job #2754857)

Utilizator cosminradu1760Cosmin-Andrei Radu cosminradu1760 Data 26 mai 2021 16:51:06
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

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

int n, m, t[60001], v[15001];

void build(int radacina, int st, int dr){

    if(st==dr)
    {
        t[radacina] = v[st];
        return;
    }

    int m = (st + dr) / 2;                      //mijlocul


    build(radacina * 2, st, m);                 //subarborele stang
    build(radacina * 2 + 1, m + 1, dr);         //subarborele drept
    t[radacina] = t[radacina * 2] + t[radacina * 2 + 1];


}

int vmax(int poz, int a, int b, int st, int dr){

    if(st >= a && b >= dr)
        return t[poz];

    int m = (st + dr) / 2, r1 = 0, r2 = 0;

    if(a <= m)
          r1 = vmax(2 * poz, a, b, st, m);

    if(b > m)
          r2 = vmax(2 * poz + 1, a, b, m + 1, dr);

    return r1 + r2;

}


void update(int radacina, int a, int b, int st, int dr){

    if(st == dr){
        t[radacina] -= b;
        return;
    }

    int m = (st + dr) / 2;

    if(a <= m)
        update(radacina * 2, a, b, st, m);
    else
        update(radacina * 2 + 1, a, b, m + 1, dr);

    t[radacina] = t[radacina * 2] + t[radacina * 2 + 1];


}


int main()
{
    fin>>n>>m;

    for(int i = 1; i <= n; i ++)
        fin>>v[i];

    build(1, 1, n);

    int c, a, b;

    for(int i = 1; i <= m; i ++)
    {
        fin>>c>>a>>b;

        if(c == 0) update(1, a, b, 1, n);
        else fout<<vmax(1, a, b, 1, n)<<"\n";
    }

    fin.close();
    fout.close();

    return 0;
}