Cod sursa(job #1761383)

Utilizator jurjstyleJurj Andrei jurjstyle Data 22 septembrie 2016 09:34:32
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <iostream>

using namespace std ;

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

int N , M , V[15005] , Arb_int[4*15000+5] ;

void creare_arb ( int indice_arbore_curent , int st , int dr )
{
 if ( st == dr )
    Arb_int[indice_arbore_curent] = V[st] ;
 else
    {
     int m = ( st + dr ) / 2 ;
     creare_arb ( 2 * indice_arbore_curent , st , m ) ;
     creare_arb ( 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
     Arb_int[indice_arbore_curent] = Arb_int[2*indice_arbore_curent] +  Arb_int[2*indice_arbore_curent+1] ;
    }
}
void update ( int i , int val , int indice_arbore_curent , int st , int dr )
{
 if ( st == dr )
    Arb_int[indice_arbore_curent] -= val ;
 else
    {

     int m = ( st + dr ) / 2 ;
     if ( i <= m )
        update ( i , val , 2 * indice_arbore_curent , st , m ) ;
     else
        update ( i , val , 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
     Arb_int[indice_arbore_curent] = Arb_int[2*indice_arbore_curent] + Arb_int[2*indice_arbore_curent+1]  ;
    }
}
int query ( int i , int j , int indice_arbore_curent , int st , int dr )
{
 if ( i == st && j == dr ) //am ajuns intr-o celula in care este deja memorat raspunsul unui interval
    return Arb_int[indice_arbore_curent] ;
 int m = ( st + dr ) / 2 ;
 if ( j <= m ) //intervalul se afla total in subarborele stang
    return query ( i , j , 2 * indice_arbore_curent , st , m ) ;
 if ( m < i ) //intervalul se afla total in subarborele drept
    return query ( i , j , 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
 //daca nu s-a indeplinit niciuna pana acum ... inseamna ca ne impartim in ambii subarbori
 return  query ( i , m , 2 * indice_arbore_curent , st , m ) + query ( m + 1 , j , 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
}



int main ()
{
 f >> N >> M ;
 for ( int i = 1 ; i <= N ; ++i )
    f >> V[i] ;
 creare_arb ( 1 , 1 , N ) ;
 for ( int i = 1 ; i <= M ; ++i )
    {
     int tip , a , b ;
     f >> tip >> a >> b ;
     if ( tip == 1 )
       g << query ( a , b , 1 , 1 , N ) << "\n" ;
     else
        update ( a , b , 1 , 1 , N ) ;
    }
}