Cod sursa(job #1344340)

Utilizator gedicaAlpaca Gedit gedica Data 16 februarie 2015 17:32:57
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>

using namespace std;

const int NMAX= 100000;

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

int st[ 4 * NMAX + 2 ], Ans;

void init( int nod, int l, int r, int poz, int val )
{
    if( l==r ) st[ nod ]= val;
    else
    {
        int mid= ( l + r ) / 2;

        if( poz <= mid )
        {
            init( 2*nod, l, mid, poz, val );
        }
        else
        {
            init( 2*nod+1, mid+1, r, poz, val );
        }

        st[nod]= st[ 2*nod ] + st[ 2*nod + 1 ];
    }
}

void Update( int nod, int l, int r, int poz, int val )
{
    if( l == r )
    {
        st[ nod ]-= val;
    }
    else
    {
        int mid= ( l + r )/2;

        if( poz <= mid )
        {
            Update( 2*nod, l, mid, poz, val );
        }
        else
        {
            Update( 2*nod+1, mid+1, r, poz, val );
        }

        st[nod]= st[ 2*nod ] + st[ 2*nod + 1 ];
    }
}

int query( int nod, int l, int r, int x, int y )
{
    int mid= ( l + r ) / 2;

    if( l >= x && y >= r )
    {
        Ans+= st[nod];
        return 0;
    }

    mid= ( l + r ) / 2;

    if( x<=mid )
    {
        query( 2*nod, l, mid, x, y );
    }
    if( y>mid )
    {
        query( 2*nod+1, mid+1, r, x, y );
    }
}

int main(  )
{
    int N, M;
    in >> N >> M;

    int x, y, a;

    for( int i= 1; i<=N; ++i )
    {
        in >> x;
        init( 1, 1, N, i, x );
    }

    for( ; M>=1 ; --M )
    {
        in >> a >> x >> y;

        if( a == 1 )
        {
            Ans= 0;
            query( 1, 1, N, x, y );
            out << Ans << '\n';
        }
        else
        {
            Update( 1, 1, N, x, y );
        }
    }

    return 0;
}