Cod sursa(job #2960143)

Utilizator LORDENVraja Luca LORDEN Data 3 ianuarie 2023 17:16:50
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>

using namespace std ;

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

int n, q, a[15005], tree[405005] ;

int query(int node, int left, int right, int query_left, int query_right)
{

    if (query_left <= left && right <= query_right)
    {
        return tree[node] ;
    }
    else
    {
        int middle = (left + right) / 2 ;

        if (query_right <= middle)
            return query(node * 2, left, middle, query_left, query_right) ;

        if (middle + 1 <= query_left)
            return query(node * 2 + 1, middle + 1, right, query_left, query_right) ;

        return query(node * 2, left, middle, query_left, query_right) + query(node * 2 + 1, middle + 1, right, query_left, query_right) ;

    }

}

void build(int node, int left, int right)
{

    if (left == right)
        tree[node] = a[left] ;

    else
    {
        int middle = (left + right) / 2 ;

        build (node * 2, left, middle) ;
        build (node * 2 + 1, middle + 1, right) ;

        tree[node] = tree[node * 2] + tree[node * 2 + 1] ;

    }

}

void update(int node, int left, int right, int position, int new_value)
{

    if (left == right)
        tree[node] -= new_value ;

    else
    {

        int middle = (left + right) / 2 ;

        if (position <= middle)
            update(node * 2, left, middle, position, new_value) ;

        else
            update(node * 2 + 1, middle + 1, right, position, new_value) ;

        tree[node] = tree[node * 2] + tree[node * 2 + 1] ;

    }

}

int main()
{

    int op, pos, value, l, r ;

    cin >> n >> q ;

    for (int i = 1 ; i <= n ; i ++)
        cin>>a[i] ;

    build(1, 1, n) ;

    for (int qq = 1 ; qq <= q ; qq ++)
    {

        cin >> op ;

        if(!op)
        {

            cin >> poz >> val ;
            update(1, 1, n, poz, val) ;

        }

        else
        {

            cin >> l >> r ;
            cout << query(1, 1, n, l, r) << '\n' ;

        }

    }

    return 0 ;

}