Cod sursa(job #2957015)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 21 decembrie 2022 16:00:54
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int NMAX = 15001;
int v[NMAX],segment_tree[4*NMAX];
void build( int node, int left, int right ){
    if( left == right )
        segment_tree[node] = v[left];
    else{
        int mid = ( left + right ) / 2;
        build( node * 2, left , mid );
        build( node * 2 + 1 , mid + 1 , right );
        segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
    }
}
int query( int node, int left, int right, int query_left, int query_right ){
    if( query_left <= left && right <= query_right )
        return segment_tree[node];
    int mid = ( left + right ) / 2;
    if( query_right <= mid )
        return query( node * 2, left, mid, query_left, query_right );
    if( mid + 1 <= query_left )
        return query( node * 2 + 1, mid + 1, right, query_left, query_right );
    return query( node * 2, left, mid, query_left, query_right ) + query( node * 2 + 1, mid + 1, right, query_left, query_right );
}
void update( int node, int left, int right, int poz, int val ){
    if( left == right )
        segment_tree[node] -= val;
    else{
        int mid = ( left + right ) / 2;
        if( poz <= mid )
            update( node * 2, left, mid, poz, val );
        else
            update( node * 2 + 1, mid + 1, right, poz, val );
        segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
    }
}
int main()
{
    int n, q;
    in >> n >> q;
    for( int i = 1; i <= n ; i++ )
        in >> v[i];
    build(1,1,n);
    while( q-- ){
        bool x;
        in >> x;
        if( x ){
            int left, right;
            in >> left >> right;
            out << query( 1, 1, n, left, right) << "\n";
        }
        else{
            int poz, val;
            in >> poz >> val;
            update( 1, 1, n, poz, val);
        }
    }
    return 0;
}