Cod sursa(job #2902173)

Utilizator BVLUBogdan Ivan BVLU Data 15 mai 2022 19:40:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.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 = max( 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 max( 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 = max( 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 == 0 )
            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;
}