Cod sursa(job #2902798)

Utilizator BVLUBogdan Ivan BVLU Data 16 mai 2022 20:35:14
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct Nod {
    int val;
    Nod *st, *dr;
};

int v[100000], n, m;

Nod* build( int st, int dr )
{
    Nod *nou = new Nod;
    if( st == dr )
    {
        nou->val = v[st];
        nou->st = NULL;
        nou->dr = NULL;
        return nou;
    }
    nou->st = build( st, ( st + dr ) / 2 );
    nou->dr = build( ( st + dr ) / 2 + 1, dr );
    nou->val = nou->st->val + nou->dr->val;
    return nou;
}

/*
void afisareRSD( Nod* n )
{
    if( n != NULL )
    {
        cout << n->val << " ";
        afisareRSD( n->st );
        afisareRSD( n->dr );
    }
}
*/

int interogare( Nod* nod, int st, int dr, int a, int b )
{
    if( a <= st && dr <= b )
        return nod->val;
    int maxSt = 0, maxDr = 0;
    int mij = ( st + dr ) / 2;
    if( a <= mij )
        maxSt = interogare( nod->st, st, mij, a, b );
    if( b > mij )
        maxDr = interogare( nod->dr, mij + 1, dr, a, b );
    return maxSt + maxDr;
}

void actualizare( Nod* nod, int st, int dr, int poz )
{
    if( st == dr )
    {
        nod->val = v[st];
        return;
    }
    int mij = ( st + dr ) / 2;
    if( st <= poz && poz <= mij )
        actualizare( nod->st, st, mij, poz );
    if( mij + 1 <= poz && poz <= dr )
        actualizare( nod->dr, mij + 1, dr, poz );
    nod->val = nod->st->val + nod->dr->val;
}

int main()
{
    f >> n >> m;
    for( int i = 0; i < n; ++i )
        f >> v[i];
    Nod *rad = build( 0, n - 1 );

    for( int i = 0; i < m; ++i )
    {
        int x, a, b;
        f >> x >> a >> b;
        if( x == 1 )
            g << interogare( rad, 0, n - 1, a - 1, b - 1 ) << "\n";
        else
        {
            v[a - 1] -= b;
            actualizare( rad, 0, n - 1, a - 1 );
        }
    }
    f.close();
    g.close();
    return 0;
}