Cod sursa(job #2126739)

Utilizator anamaria41Raicu Ana anamaria41 Data 9 februarie 2018 22:02:54
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#define N 15005
using namespace std;
int n,m,c,i,x,y,arb[4*N+50];


void update( int nod, int L, int R, int poz, int val )
{
    int mij;

    if ( L == R ) {arb[ nod ] -= val; return;}
    else {
        mij = (L+R) / 2;
        if ( poz <= mij ) update ( 2*nod, L, mij, poz, val );
        else update ( 2*nod+1, mij+1, R, poz, val );
        arb[ nod ] = arb[ 2 * nod ] + arb[ 2 * nod + 1 ];
    }

}

int query ( int nod, int L, int R, int start, int finish )
{
    int mij, rez1=-1, rez2=-1;
    if ( start<= L && R<=finish ) return arb [nod];

    mij= (L+R)/2;

    if ( start<= mij ) rez1= query ( 2*nod, L, mij, start, finish );
    if ( mij < finish ) rez2 = query( 2*nod+1, mij+1, R, start, finish );
        return rez1+rez2;
}



int main()
{
    freopen ( "datorii.in", "r", stdin );
    freopen ( "datorii.out", "w", stdout );

    scanf ("%d%d", &n, &m );

    for ( i=1; i<=n; i++)
     {
        scanf ( "%d", &x);
        update( 1,1,n, i,-x );
     }

    for ( ; m; m-- )
    {
        scanf ("%d%d%d", &c, &x, &y);
        if ( c )
           printf ("%d\n", query (1,1,n,x,y) );
        else
            update (1,1,n,x,y);
    }



    return 0;
}