Cod sursa(job #2736692)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 3 aprilie 2021 19:35:14
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#define nl '\n'
using namespace std;
ifstream f ( "datorii.in" );
ofstream g ( "datorii.out" );
const int NMAX = 15002;
int aint[4 * NMAX];
int v[NMAX], N, M;
void build ( int x, int lx, int rx )
{
    if ( rx == lx )
    {
        if ( rx <= N )
            aint[x] = v[rx];

        return;
    }

    int m = ( lx + rx ) / 2;
    build ( 2 * x, lx, m );
    build ( 2 * x + 1, m + 1, rx );
    aint[x] = aint[2 * x] + aint[2 * x + 1];
}
void Update ( int x, int lx, int rx, int poz, int val )
{
    if ( lx == rx )
    {
        aint[x] -= val;
        return;
    }

    int m = ( lx + rx ) / 2;

    if ( poz <= m )
        Update ( 2 * x, lx, m, poz, val );
    else Update ( 2 * x + 1, m + 1, rx, poz, val );

    aint[x] = aint[2 * x + 1] + aint[2 * x];
}
int Sum ( int x, int lx, int rx, int l, int r )
{
    if ( lx >= l && rx <= r )
        return aint[x];

    if ( rx < l || lx > r )
        return 0;

    int m = ( lx + rx ) / 2;
    int s1 = Sum ( 2 * x, lx, m, l, r );
    int s2 = Sum ( 2 * x + 1, m + 1, rx, l, r );
    return s1 + s2;
}
int main()
{
    f >> N >> M;

    for ( int i = 1; i <= N; i++ )
        f >> v[i];

    build ( 1, 1, N );

    while ( M-- )
    {
        int tip;
        f >> tip;

        if ( tip == 0 )
        {
            int T, V;
            f >> T >> V;
            Update ( 1, 1, N, T, V );
        }
        else
        {
            int P, Q;
            f >> P >> Q;
            g << Sum ( 1, 1, N, P, Q ) << nl;
        }
    }

    return 0;
}