Cod sursa(job #1397467)

Utilizator DysKodeTurturica Razvan DysKode Data 23 martie 2015 15:57:58
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>

using namespace std;

#define DIM 15010

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

int Arb[DIM*4],i,j,n,m,v[DIM],x,y,q,ans;

void _Build(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[ nod ] = v[ left ];
        return;
    }

    int middle = ( left + right ) / 2;

    _Build( 2 * nod , left , middle );
    _Build( 2 * nod + 1 , middle + 1 , right );

    Arb[ nod ] = Arb[ 2 * nod ] + Arb[ 2 * nod + 1 ];

}

void _Update(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[ nod ] -= y;
        return;
    }

    int middle = ( left + right ) / 2;

    if( x < middle )
        _Update( 2 * nod , left , middle );
    else
        _Update( 2 * nod + 1 , middle + 1 , right);

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

void _Query(int nod, int left, int right)
{
    if( left >= x && right <= y )
    {
        ans += Arb[ nod ];
        return;
    }

    if( left > y || right < x )
        return;

    int middle = ( left + right ) / 2;

    _Query( 2 * nod , left , middle );
    _Query( 2 * nod + 1 , middle + 1 , right);
}

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

    for(i=1 ; i<=n ; ++i)
        fin>>v[i];

    _Build(1 , 1 , n);

    for(i=1 ; i<=m ; ++i)
    {
        fin>>q>>x>>y;
        if( q == 0 )
            _Update( 1 , 1 , n );
        else
        {
            ans = 0;
            _Query( 1 , 1 , n );
            fout<<ans<<'\n';
        }
    }


return 0;
}