Cod sursa(job #1886085)

Utilizator Victor24Vasiesiu Victor Victor24 Data 20 februarie 2017 17:22:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
using namespace std;

int arb[ 15005 * 4 ] , i , n, m, x, ans, a, b;

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

void update ( int nod , int st, int dr, int poz, int val )
{
    int mij = ( st + dr ) / 2;

    if ( st == dr )
    {
        arb [ nod ] -= val;
        return;
    }

    if ( poz <= mij )
    {
        update ( 2*nod , st , mij , poz, val );
    }
    else
    {
        update ( 2*nod+1 , mij + 1 , dr , poz , val );
    }
    arb[nod] = arb [ 2 * nod ] + arb [ 2 * nod + 1 ];

}
void ins ( int nod , int st, int dr, int poz, int val )
{
    int mij = ( st + dr ) / 2;

    if ( st == dr )
    {
        arb [ nod ] = val;
        return;
    }

    if ( poz <= mij )
    {
        ins ( 2*nod , st , mij , poz, val );
    }
    else
    {
        ins ( 2*nod+1 , mij + 1 , dr , poz , val );
    }
    arb[nod] = arb [ 2 * nod ] + arb [ 2 * nod + 1 ];

}

void query ( int nod , int st, int dr , int L , int R )
{
    int mij = ( st + dr ) / 2;

    if ( st >= L && dr <= R )
    {
        ans = ans + arb [ nod ];
        return;
    }

    if ( st > R || dr < L )
    {
        return;
    }

    query ( 2*nod , st , mij , L , R );
    query ( 2*nod+1 , mij + 1 , dr , L , R );

}

int main ()
{
    f>>n>>m;

    for ( i=1; i<=n ; i++)
    {
        f>>x;
        ins ( 1 , 1 , n , i , x );
    }

    for ( i = 1 ; i <= m ; i++ )
    {
        f>>x>>a>>b;
        if ( x == 0 )
        {
            update ( 1 , 1 , n , a , b );
        }
        else
        {
            ans=0;
            query ( 1 , 1 , n , a , b );
            g<<ans<<'\n';
        }
    }

    return 0;
}