Cod sursa(job #2536625)

Utilizator ElektrykT E S L A P E F E L I E Elektryk Data 2 februarie 2020 13:06:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;

ifstream in ("arbint.in");
ofstream out ("arbint.out");

void update ( int nod, int left, int right, int poz, int val);

void f_find ( int nod, int left, int right );

int aint[400137];

int n, m;

int a, b;

int mx;

int main()
{
    in >> n >> m;
    for ( register int i = 1 ; i <= n ; ++i )
    {
        in >> a;
        update ( 1, 1, n, i, a );
    }
    for ( register int j = 1 ; j <= m ; ++j )
    {
        in >> a;
        if ( a == 0 )
        {
            in >> a >> b;
            mx = 0;
            f_find ( 1, 1, n );
            out << mx << '\n';
        }
        else
        {
            in >> a >> b;
            update ( 1, 1, n, a, b );
        }
    }
    return 0;
}

void update ( int nod, int left, int right, int poz, int val)
{
    int mid = ( left + right ) / 2;
    if ( left == right )
    {
        aint[nod] = val;
        return ;
    }
    if ( poz <= mid )
        update ( nod * 2, left, mid, poz, val );
    else
        update ( nod * 2 + 1, mid + 1, right, poz, val );
    aint[nod] = max ( aint[nod * 2], aint[nod * 2 + 1] );
}

void f_find ( int nod, int left, int right )
{
    int mid = ( left + right ) / 2;
    if ( a <= left && right <= b )
    {
        if ( mx < aint[nod] )
            mx = aint[nod];
        return ;
    }
    if ( a <= mid )
        f_find ( nod * 2, left, mid );
    if ( mid < b )
        f_find ( nod * 2 + 1, mid + 1, right );
}