Cod sursa(job #2786508)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 21 octombrie 2021 09:11:04
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>

using namespace std;

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

#define NMAX 15000

int aint[NMAX * 4 + 1];

void update1( int poz, int val ) {
    aint[poz] = val;
    while ( poz > 1 ) {
        if (poz % 2 == 0 )
            aint[poz / 2] = aint[poz] + aint[poz + 1];
        else
            aint[poz / 2] = aint[poz - 1] + aint[poz];
        poz /= 2;
    }
}

int query(int ind, int csta, int cdra, int cstq, int cdrq ) {
    if ( cstq <= csta && cdra <= cdrq ) {
        return aint[ind];
    } else {
        int aux = 0;
        //comparam cu mijlocul
        if ( cstq <= (csta + cdra) / 2 ) {
            aux = aux + query(ind * 2, csta, (csta + cdra) / 2, cstq, cdrq);
        }
        if ( cdrq > (csta + cdra) / 2 ) {
            aux = aux + query(ind * 2 + 1, (csta + cdra) / 2 + 1, cdra, cstq, cdrq );
        }
        return aux;
    }
}

int main() {
    int n, m, i, x, p, op, a, b;
    cin >> n >> m;
    p = 1;
    while ( p <= n ) {
        p = p * 2;
    }
    for ( i = 0; i < n; i++ ) {
        cin >> x;
        update1( p + i, x );
    }
    for ( i = 0; i < m; i++ ) {
        cin >> op >> a >> b;
        if ( op == 0 ) {
            update1( p + a - 1, b );
        }
        else {
            cout << query( 1, 1, p, a, b ) << "\n";
        }
    }
    return 0;
}