Cod sursa(job #3141598)

Utilizator elisa.ipateElisa Ipate elisa.ipate Data 14 iulie 2023 18:31:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <iostream>

#define MAXN 100000

using namespace std;

int a[MAXN], aint[4*MAXN];
int ans;

void init( int nod, int l, int r ) {
    if( l == r )
        aint[nod] = a[r];
    else {
        init( nod*2+1, l, (l+r)/2 );
        init( nod*2+2, (l+r)/2+1, r );
        aint[nod] = aint[nod*2+1] + aint[nod*2+2];
    }
}

void update( int nod, int l, int r, int poz ) {
    if( poz < l || poz > r )
        return;
    if( l == r )
        aint[nod] = a[r];
    else {
        update( nod*2+1, l, (l+r)/2, poz );
        update( nod*2+2, (l+r)/2+1, r, poz );
        aint[nod] = aint[nod*2+1] + aint[nod*2+2];
    }
}

void query( int nod, int l, int r, int lq, int rq ) {
    if( r < lq || l > rq )
        return;
    else if( r <= rq && l >= lq )
        ans += aint[nod];
    else {
        query( nod*2+1, l, (l+r)/2, lq, rq );
        query( nod*2+2, (l+r)/2+1, r, lq, rq );
    }
}

int main() {
    int n, m, i, p, q, t;
    ifstream cin("datorii.in");
    ofstream cout ("datorii.out");
    cin >> n >> m;
    for( i = 0; i < n; i++ )
        cin >> a[i];
    init( 0, 0, n-1 );
    for( i = 0; i < m; i++ ) {
        cin >> t >> p >> q;
        if( t == 0 ) {
            a[p-1] -= q;
            update( 0, 0, n-1, p-1 );
        } else {
            ans = 0;
            query( 0, 0, n-1, p-1, q-1 );
            cout << ans << "\n";
        }
    }
    return 0;
}