Cod sursa(job #2565601)

Utilizator ElektrykT E S L A P E F E L I E Elektryk Data 2 martie 2020 15:16:22
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>

using namespace std;

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

void update ( int nod, int left, int right, int poz, int val );

void dec ( int nod, int left, int right, int poz, int val );

void f_find ( int nod, int left, int right );

int n, m;

int aint[100137];

int s, c, a, b;

int main()
{
    in >> n >> m;
    for ( register int i = 1 ; i <= n ; ++i )
    {
        in >> a;
        update ( 1, 1, n, i, a);
    }
    for ( register int i = 1 ; i <= m ; ++i )
    {
        in >> c >> a >> b;
        if ( c == 0 )
            dec ( 1, 1, n, a, b );
        else
        {
            s = 0;
            f_find ( 1, 1, n );
            out << s << '\n';
        }
    }
    return 0;
}

void update ( int nod, int left, int right, int poz, int val )
{
    int mid = ( left  + right ) / 2;
    if ( left == right )
    {
        aint[nod] = val;
        return;
    }
    if ( poz <= mid )
        update ( nod * 2 , left, mid, poz, val );
    else
        update ( nod * 2 + 1, mid + 1, right, poz, val );
    aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

void dec ( int nod, int left, int right, int poz, int val )
{
    int mid = ( left  + right ) / 2;
    if ( left == right )
    {
        aint[nod] -= val;
        return;
    }
    if ( poz <= mid )
        dec ( nod * 2 , left, mid, poz, val );
    else
        dec ( nod * 2 + 1, mid + 1, right, poz, val );
    aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

void f_find ( int nod, int left, int right )
{
    int mid = ( left + right ) / 2;
    if ( a <= left  &&  right <= b )
    {
        s += aint[nod];
        return ;
    }
    if ( a <= mid )
        f_find ( nod * 2 , left , mid );
    if ( mid < b )
        f_find ( nod * 2 + 1 , mid + 1 , right );
}