Cod sursa(job #2903828)

Utilizator bianca2002Bianca bianca2002 Data 17 mai 2022 20:47:54
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int arbore[600001], mijloc;

void creare(int x, int st, int dr, int k, int val)
{
    if (st == dr)
    {
        arbore[x] = val;
        return;
    }

    mijloc = (st+dr)/2;

    if (k <= mijloc) creare(x*2, st, mijloc, k, val);
    else creare(x*2 + 1, mijloc + 1, dr, k, val);
    arbore[x] = arbore[x*2] + arbore[x*2 + 1];
}

void modificare(int x, int st, int dr, int k, int val)
{
    if (st == dr)
    {
        arbore[x] -= val;
        return;
    }

    mijloc = (st+dr)/2;

    if (k <= mijloc) modificare(x*2, st, mijloc, k, val);
    else modificare(x*2 + 1, mijloc + 1, dr , k, val);
    arbore[x] = arbore[x*2] + arbore[x*2+1];
}


int suma_interval(int x, int st, int dr, int i, int j)
{
    if (st >= i && dr <= j)
        return arbore[x];
    int s1=0, s2=0;
    mijloc = (st+dr)/2;
    if (i <= mijloc)
        s1 = suma_interval(x*2, st, mijloc, i, j);
    if (j > mijloc)
        s2 = suma_interval(x*2+1, mijloc + 1, dr, i, j);
    return s1+s2;
}

int main ()
{
    int n, m, i, val, optiune, val1, val2;

    f >> n >> m;

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

    for(i = 1; i <= m; i++)
    {
        f >> optiune >>val1>>val2;
        if(optiune == 1)
        {
            g << suma_interval(1, 1, n, val1, val2) <<endl;
        }
        else
        {
            modificare(1, 1, n, val1, val2);
        }

    }

}