Cod sursa(job #847446)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 3 ianuarie 2013 21:38:41
Problema Datorii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>
#include <stdlib.h>

int arb[2000000];
int N , M , aux , a , b , op ;

void update ( int nod , int stanga , int dreapta )
{
    if ( stanga == dreapta ) arb[nod] += b;

        else
        {
            int mid = ( stanga + dreapta ) / 2;
            if ( a <= mid ) update ( 2 * nod , stanga , mid );
                else update ( 2 *nod + 1 , mid + 1 , dreapta );
            arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
        }

}

void query ( int nod , int stanga , int dreapta )
{
    if ( a <= stanga && dreapta <= b )
        aux = aux + arb[nod];
        else
        {
            int mid = ( stanga + dreapta ) / 2;
            if ( a <= mid ) query ( 2 * nod , stanga , mid );
            if ( mid < b ) query ( 2 * nod + 1 , mid + 1 , dreapta );
        }
}

int main ()
{
    FILE *fin , *fout;
    fin = fopen ( "datorii.in" , "rt" );
    fout = fopen ( "datorii.out" , "wt" );

    fscanf ( fin , " %d %d " , &N , &M );

    for ( int i = 1 ; i <= N ; i++ )
    {
        a = i;
        fscanf ( fin , "%d"  , &b );
        update ( 1 , 1 , N );
    }

    for ( int i = 1 ; i <= M ; i++ )
    {
        fscanf ( fin , "%d %d %d " , &op , &a , &b );
        if ( !op )
        {
            b = -b;
            update ( 1 , 1 , N );
        }
            else
            {
                aux = 0;
                query ( 1 , 1 , N );
                printf ( "%d\n" , aux );
                fprintf ( fout , "%d\n" , aux );
            }
    }

    fclose ( fin );
    fclose ( fout );
    return 0;

}