Cod sursa(job #1253848)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 1 noiembrie 2014 21:19:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
using namespace std;

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

int n, m, poz, val;
int nr, A, B;
int a[2 << 17];

void UPDATE(int nod, int st, int dr);
int QUERY(int nod, int st, int dr);

int main()
{
    is >> n >> m;
    for ( int i = 1; i <= n; ++i )
    {
        is >> val;
        poz = i;
        UPDATE(1, 1, n);
    }
    while ( m-- )
    {
        is >> nr;
        if ( nr )
        {
            is >> poz >> val;
            UPDATE(1, 1, n);
        }
        else
        {
            is >> A >> B;
            os << QUERY(1, 1, n) << "\n";
        }
    }
    is.close();
    os.close();
    return 0;
}

void UPDATE(int nod, int st, int dr)
{
    if ( st == dr )
    {
        a[nod] = val;
        return;
    }
    int md = ( st + dr ) / 2;
    if ( poz <= md )
        UPDATE(2 * nod, st, md);
    else
        UPDATE(2 * nod + 1, md + 1, dr);
    a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}

int QUERY(int nod, int st, int dr)
{
    if ( A <= st && B >= dr  )
        return a[nod];
    int md = ( st + dr ) / 2;
    int m1 = 0, m2 = 0;
    if ( A <= md )
        m1 = QUERY(2 * nod, st, md);
    if ( B > md )
        m2 = QUERY(2 * nod + 1, md + 1, dr);
    return max(m1, m2);
}