Cod sursa(job #2815613)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 9 decembrie 2021 21:59:54
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <stdio.h>
#define N 15000
#define UPDATE 0
#define QUERY 1

short v[N];
int aint[N * 2];
int n;

int leftSon( int node ) { return node + 1; }
int rightSon( int node, int low, int high ) {
    int middle = (low + high) / 2;
    return node + (middle - low + 1) * 2;
}

void build( int node, int low, int high ) {
    if ( low == high ) {
        aint[node] = v[low];
        return;
    }

    int leftChild, rightChild, middle = (low + high) / 2;
    leftChild = leftSon( node );
    rightChild = rightSon( node, low, high );

    build( leftChild, low, middle );
    build( rightChild, middle + 1, high );

    aint[node] = aint[leftChild] + aint[rightChild];
}

void update( int node, int low, int high, int poz, int val ) {
    if ( low == poz && low == high ) {
        aint[node] = v[poz] = v[poz] - val;
        return;
    }

    int leftChild, rightChild, middle = (low + high) / 2;
    leftChild = leftSon( node );
    rightChild = rightSon( node, low, high );

    if ( poz <= middle )
        update( leftChild, low, middle, poz, val );
    if ( middle + 1 <= poz )
        update( rightChild, middle + 1, high, poz, val );

    aint[node] = aint[leftChild] + aint[rightChild];
}

int query( int node, int low, int high, int ql, int qr ) {
    if ( ql <= low && high <= qr )
        return aint[node];

    int leftChild, rightChild, middle = (low + high) / 2, ans = 0;
    leftChild = leftSon( node );
    rightChild = rightSon( node, low, high );

    if ( ql <= middle )
        ans += query( leftChild, low, middle, ql, qr );
    if ( middle + 1 <= qr )
        ans += query( rightChild, middle + 1, high, ql, qr );

    return ans;
}

int main() {
    FILE *fin, *fout;
    int q, pb, a, b;

    fin = fopen( "datorii.in", "r" );
    fout = fopen( "datorii.out", "w" );
    fscanf( fin, "%d%d", &n, &q );
    for ( int i = 0; i < n; i ++ )
        fscanf( fin, "%hd", &v[i] );
    build( 1, 0, n - 1 );
    for ( int i = 0; i < q; i ++ ) {
        fscanf( fin, "%d%d%d", &pb, &a, &b );
        if ( pb == UPDATE )
            update( 1, 0, n - 1, a - 1, b );
        else
            fprintf( fout, "%d\n", query( 1, 0, n - 1, a - 1, b - 1 ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}