Cod sursa(job #2904032)

Utilizator florina15Florina florina15 Data 17 mai 2022 22:00:56
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");

int arb[4000001];

void creare(int x, int st, int dr, int poz, int val)
{

    if(poz < st || poz > dr) return;
    if(st == dr)
    {
        arb[x] = val;
        return;
    }
    int mij = (st + dr)/2;
    creare(2 * x, st, mij, poz, val);
    creare(2 * x +1, mij+1, dr, poz, val);

    arb[x] = arb[2*x] + arb[2*x+1];
}
int suma(int x, int st, int dr, int i, int j)
{
    if(i > dr || j < st) return 0;
    if( st >= i && dr <= j) return arb[x];

    int mij = (st + dr)/2;
    return suma(2*x, st, mij, i, j) + suma(2*x+1, mij+1, dr, i, j);
}

void modificare(int x, int st, int dr, int poz, int val)
{

    if(poz < st || poz > dr) return;
    if(st == dr)
    {
        arb[x]-=val;
        return;
    }
    int mij = (st + dr)/2;
    modificare(2*x, st, mij, poz, val);
    modificare(2*x+1, mij+1, dr, poz, val);

    arb[x] =  arb[2*x] + arb[2*x+1];
}

int main()
{
    int n, m;
    f>>n>>m;

    for( int i=1; i<=n; i++)
    {
        int x;
        f>>x;
        creare(1, 1, n, i, x);
    }

    int op, a, b;
    for (int i=1; i<=m; i++)
    {
        f>>op>>a>>b;
        if(op)
            g<<suma(1, 1, n, a, b)<<endl;
        else modificare(1, 1, n, a, b);

    }
    return 0;
}