Cod sursa(job #2773256)

Utilizator Victor24Vasiesiu Victor Victor24 Data 5 septembrie 2021 21:27:47
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("datorii.in");
ofstream g ("datorii.out");

vector<int> aint(60005, 0);
vector<int> val(15005, 0);

void build( int index, int l, int r){
    //cout << l << r << '\n';
    if(l == r){
        aint[index] = val[l];
        //cout << l << " " << r << " " << aint[index] << '\n';
        return;
    }
    int mid = (l + r)/2;
    build(2*index, l, mid);
    build(2*index+1, mid+1, r);
    aint[index] = aint[2*index] + aint[2*index+1];
    //cout << l << " " << r << " " << aint[index] << '\n';
}

int query( int index, int l, int r, int ql, int qr ){
    //cout << l << r << '\n';
    if( l >= ql && r <= qr ){
        return aint[index];
    }
    if( l > qr || r < ql )
        return 0;
    int mid = (l+r)/2;
    return query( 2*index , l, mid, ql, qr) + query(2*index+1 , mid+1, r, ql, qr);
}

void update ( int index , int l, int r, int update_val, int index_to_update ){
    if ( index_to_update < l || index_to_update > r )
        return;
    aint[index] += update_val;
    if( l == r )
        return;
    int mid = (l+r)/2;
    update( 2*index , l, mid, update_val, index_to_update);
    update( 2*index+1 , mid+1, r, update_val, index_to_update);
}

int main()
{
    int n,m;

    f >> n >> m;
    for ( int i = 1 ; i <= n ; i++ ){
        f>>val[i];
    }

    build(1, 1, n);

    int q_type, a, b;

    for ( int i = 0 ; i < m ; i++ ){
        f >> q_type >> a >> b;
        if ( q_type == 0 ){
            update( 1, 1, n, -b, a);
        }
        else{
            g << query(1, 1, n, a, b) << '\n';
        }
    }

    return 0;
}