Cod sursa(job #3149974)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 13 septembrie 2023 21:58:35
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <fstream>

using namespace std;
ifstream cin("datorii.in");
ofstream cout("datorii.out");
long long seg_tree [ 900005 ];
long long v[ 200005];

void build (long long st, long long dr, long long nod )
{
    if ( st == dr )
    {
        seg_tree [ nod ] = v [st ] ;
    }
    else
    {
        long long mid = ( st + dr ) / 2;

        build( st, mid, nod * 2 );
        build ( mid + 1, dr, nod * 2 + 1) ;
        seg_tree [ nod ] += seg_tree [ nod * 2 ] + seg_tree [ nod * 2 + 1 ] ;
    }

}

void update ( long long st, long long dr, long long nod, long long target )
{
    if ( st == dr )
    {
        seg_tree [ nod ] = v [ st ];
    }
    else
    {
        long long mid = ( st + dr) / 2;

        if ( mid >= target )
        {
            update ( st, mid, nod * 2, target );

        }
        else if ( mid < target )
        {
            update ( mid + 1, dr, nod * 2 + 1, target );
        }

        seg_tree [ nod ] = seg_tree[ nod * 2 ] + seg_tree [ nod * 2 + 1];
    }
}

long long query ( long long st, long long dr, long long nod, long long l, long long r )
{
    if ( st >= l && dr <= r )
    {
        return seg_tree [ nod ];
    }
    else if ( st > r || dr < l )
        return 0 ;
    else
    {
        long long mid = ( st + dr) / 2 ;

        return query ( st, mid, nod * 2, l, r ) + query ( mid + 1, dr, nod * 2 + 1, l, r );
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    long long n, q ;

    cin >> n  >> q ;

    for ( int i = 1; i <= n ; i ++ )
    {
        cin >> v[ i ] ;
    }

    build ( 1, n, 1 );



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

        int tip ;
        cin >> tip ;

        tip ++ ;
        if ( tip == 1 )
        {
            long long a, b ;

            cin >> a >> b ;
            v [a ] -= b ;
            update ( 1, n, 1, a );
        }
        else
        {
            int l, r ;
            cin >> l >> r ;

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

    }
    return 0;
}