Cod sursa(job #2153031)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 5 martie 2018 22:01:47
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

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

int n , m , start , finall , poz , val , suma ;
int arb[60001] ;

void pun(int nod , int st , int dr )
{
    if ( st == dr )
    {
        arb[nod] = val ;
        return ;
    }
    int med = (st+dr)/2 ;
    if ( poz <= med )
        pun(2*nod,st,med) ;
    else
        pun(2*nod+1,med+1,dr );
    arb[nod] = arb[2*nod]+arb[2*nod+1] ;
}

void cautare(int nod , int st , int dr )
{
    if ( start <= st && dr <= finall )
    {
        suma = suma+arb[nod] ;
        return ;
    }
    int med = (st+dr)/2 ;
    if ( start <= med )
        cautare(2*nod,st,med) ;
    if ( med < finall )
        cautare(2*nod+1,med+1,dr) ;
}

void schimb(int nod , int st , int dr )
{
    if ( st == dr )
    {
        arb[nod] = arb[nod]-val ;
        return ;
    }
    int med = (st+dr)/2 ;
    if ( poz <= med )
        schimb(2*nod,st,med) ;
    else
        schimb(2*nod+1,med+1,dr) ;
    arb[nod] = arb[2*nod]+arb[2*nod+1] ;
}

int main()
{
    int i , tip ;
    fin >> n >> m ;
    for ( i = 1 ; i <= n ; i++ )
    {
        fin >> val ;
        poz = i ;
        pun(1,1,n) ;
    }
    for ( i = 1 ; i <= 2*n ; i++ )
        cout << arb[i] << " " ;
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> tip ;
        if ( tip == 1 )
        {
            fin >> start >> finall ;
            suma = 0;
            cautare(1,1,n) ;
            fout << suma << '\n' ;
        }
        else
        {
            fin >> poz >> val ;
            schimb(1,1,n) ;
        }
    }
}