Cod sursa(job #1393834)

Utilizator Burbon13Burbon13 Burbon13 Data 19 martie 2015 19:49:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <cstdio>
using namespace std;

#define n_max 15005

int arb[4*n_max] ;
int n,m ;
int a,b ;
int sum ;

void actualizare( int nod , int st , int dr )
{
    if ( st == dr )
    {
        arb[nod] -= b ;
        return ;
    }
    int mij = ( st + dr ) / 2 ;
    if ( a <= mij )
        actualizare( 2 * nod , st , mij ) ;
    else
        actualizare( 2 * nod + 1 , mij + 1 , dr ) ;
    arb[nod] = arb[2*nod] + arb[2*nod+1] ;
}

void citire()
{
    scanf( "%d %d" , &n , &m ) ;
    for ( a = 1 ; a <= n ; a ++ )
    {
        scanf( "%d" , &b ) ;
        b = -b ;
        actualizare(1,1,n) ;
    }
}

void interogare( int nod , int st , int dr )
{
    if ( a <= st && dr <= b )
    {
        sum += arb[nod] ;
        return ;
    }
    int mij = ( st + dr ) / 2 ;
    if ( a <= mij )
        interogare( 2 * nod , st , mij ) ;
    if ( b > mij )
        interogare( 2 * nod + 1 , mij + 1 , dr ) ;
}

void rezolvare()
{
    int c ;
    for ( int i = 1 ; i <= m ; i ++ )
    {
        scanf( "%d %d %d" , &c , &a , &b ) ;
        if ( c == 0 )
            actualizare(1,1,n) ;
        else
            {
                sum = 0 ;
                interogare(1,1,n) ;
                printf( "%d\n" , sum ) ;
            }
    }
}

int main()
{
    freopen( "datorii.in" , "r" , stdin ) ;
    freopen( "datorii.out" , "w" , stdout ) ;

    citire() ;
    rezolvare() ;

    return 0;
}