Cod sursa(job #1320112)

Utilizator gedicaAlpaca Gedit gedica Data 17 ianuarie 2015 16:56:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>

using namespace std;

const int NMAX = 100000;

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

int a[4*NMAX+1], Ans_Q;

void Build( int nod, int st, int dr, int poz, int val )
{
    if( st == dr )
    {
        a[nod]= val;
    }
    else
    {
        int mid= ( st+dr )/2;
        if( poz <= mid )
        {
            Build( 2*nod, st, mid, poz, val );
        }
        else
        {
            Build( 2*nod+1, mid+1, dr, poz, val );
        }
        a[nod]= a[2*nod]+a[2*nod+1];
    }
}

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

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

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

void Querry( int nod, int st, int dr, int x, int y )
{
    int mid= ( st+dr )/2;

    if( st >= x && y >= dr )
    {
        Ans_Q+= a[nod];
        return;
    }

    mid= ( st+dr )/2;

    if( x<=mid )
    {
        Querry( 2*nod, st, mid, x, y );
    }
    if( y>mid )
    {
        Querry( 2*nod+1, mid+1, dr, x, y );
    }
}

int main()
{
    int N, M, x, t, y;
    in >> N >> M;

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

    for( int i= 1;  i<=M;  ++i )
    {
        in >> t >> x >> y;

        if( t == 1 )
        {
            Ans_Q= 0;
            Querry( 1, 1, N, x, y );
            out << Ans_Q << '\n';
        }
        else
        {
            Update( 1, 1, N, x, y );
        }
    }

    return 0;
}