Cod sursa(job #2406156)

Utilizator andreichiricaAndrei Chirica andreichirica Data 15 aprilie 2019 14:03:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <fstream>

using namespace std;

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

#define dim 100005

int N, M, arbore[1000005];
int valoare, pozitie, operatie, a, b, maxim, start, finish;

int Maxim ( int a, int b )
{
    if ( a >= b ) return a;
    return b;
}

void Actualizare ( int nod, int stanga, int dreapta )
{
    if ( stanga == dreapta )
    {
        arbore[nod] = valoare;
        return;
    }
    int mijloc = ( stanga + dreapta ) / 2;
    if ( pozitie <= mijloc )
        Actualizare ( 2 * nod, stanga, mijloc );
    else
        Actualizare ( 2 * nod + 1, mijloc + 1, dreapta );
    arbore[nod] = Maxim ( arbore[2 * nod], arbore[2 * nod + 1]);
}

void Interogare ( int nod, int stanga, int dreapta )
{
    if ( start <= stanga && finish >= dreapta )
    {
        if ( maxim < arbore[nod] )
            maxim = arbore[nod];
        return;
    }
    int mijloc = ( stanga + dreapta ) / 2;
    if ( start <= mijloc ) Interogare ( 2 * nod, stanga, mijloc );
    if ( finish > mijloc ) Interogare( 2 * nod + 1, mijloc + 1, dreapta );

}

int main()
{
    fin >> N >> M;
    for ( int i = 1; i <= N; i++ )
    {
        fin >> valoare;
        pozitie = i;
        Actualizare ( 1, 1, N );
    }
    for ( int i = 1; i <= M; i++ )
    {
        fin >> operatie >> a >> b;
        if ( operatie )
        {
            pozitie = a;
            valoare = b;
            Actualizare ( 1, 1, N );
        }
        else
        {
            maxim = -1;
            start = a;
            finish = b;
            Interogare ( 1, 1, N );
            fout << maxim << "\n";
        }
    }
}