Cod sursa(job #2903984)

Utilizator bianca.andreiAndrei Bianca bianca.andrei Data 17 mai 2022 21:48:18
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <iostream>

using namespace std;

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

int arb[600000];



void creare(int x, int st, int dr)
{
    if(st == dr)
        f>>arb[x];

    else
    {
        int mij = (st + dr) >> 1;

        creare(2 * x, st, mij);
        creare(2 * x + 1, mij + 1, dr);
        arb[x] = arb[2 * x] + arb[2 * x + 1];
    }
}

void modifica(int x, int st, int dr, int k, int val)
{
    if(st == dr)
        arb[x] -= val;

    else
    {
        int mij = (st + dr) >> 1;

        if (k <= mij)
            modifica(2 * x, st, mij, k, val);
        else
            modifica(2 * x + 1, mij + 1, dr, k, val);

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

int suma(int x, int st, int dr, int i, int j)
{
    if (i == st && dr == j)
    {

        return arb[x];
    }


    int mij = (st + dr) >> 1;

    if(j <= mij)
        return suma(2 * x, st, mij, i, j);

    else if(mij < i)
        return suma(2 * x + 1, mij + 1, dr, i, j);


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



}


int main()
{

    int n, m, i, opt, a, b;

    f>>n>>m;


    creare(1, 1, n);

//    for(i=1;i<=4*n;i++)
//        cout<<arb[i]<<" ";

    for(i=1; i<=m; i++)
    {
        f>>opt>>a>>b;

        if(opt)
        {
            g<<suma(1, 1, n, a, b)<<endl;
        }
        else
        {
           modifica(1, 1, n, a, b);
        }
    }
    return 0;
}