Cod sursa(job #394789)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 11 februarie 2010 16:30:48
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on January 30, 2010, 12:20 PM
 */
#include <fstream>
#define Nmax 4*15000+1

/*
 *
 */
using namespace std;
int sum;
int v[Nmax];
inline void Update1( int vertex, int left, int right, int p, int x )
{
    if( left == right )
    {
        v[vertex]+=x;
        return;
    }
    int middle( left+(right-left)/2 );
    if( p <= middle )
        Update1( 2*vertex, left, middle, p, x );
    else Update1( 2*vertex+1, middle+1, right, p, x );
    v[vertex]=v[2*vertex]+v[2*vertex+1];
}
inline void Update2( int vertex, int left, int right, int p, int x )
{
    if( left == right )
    {
        v[vertex]-=x;
        return;
    }
    int middle( left+(right-left)/2 );
    if( p <= middle )
        Update2( 2*vertex, left, middle, p, x );
    else Update2( 2*vertex+1, middle+1, right, p, x );
    v[vertex]=v[2*vertex]+v[2*vertex+1];
}
inline int Query( int vertex, int left, int right, int a, int b )
{
    if( a <= left && right <= b )
    {
        return v[vertex];
    }
    int sum=0, middle=left+(right-left)/2;
    if( a <= middle )
        sum+=Query( 2*vertex, left, middle, a, b );
    if( b > middle )
        sum+=Query( 2*vertex+1, middle+1, right, a, b );
    return sum;
}
int main()
{
    int n, m, i, x, y, z;
    ifstream in("datorii.in");
    in>>n>>m;
    for( i=1; i <= n; ++i )
    {
        in>>x;
        Update1( 1, 1, n, i, x );
    }
    ofstream out("datorii.out");
    for( i=1; i <= m; ++i )
    {
        in>>x>>y>>z;
        if( 0 == x )
            Update2( 1, 1, n, y, z );
        else out<<Query( 1, 1, n, y, z )<<'\n';
    }
    return 0;
}