Cod sursa(job #2977685)

Utilizator e_ggIonescu Dorian e_gg Data 12 februarie 2023 11:28:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

const int nmax = 1e5 + 3;

int a[3 * nmax];
int n, m, x, y, p, tip;

int query(int nod, int x, int y, int st, int dr) {
    int mij = ( st + dr ) / 2;
    if ( x == st && y == dr )
        return a[nod];
    else if ( y <= mij )
        return query(nod * 2, x, y, st, mij);
    else if ( x >= mij + 1 )
        return query(nod * 2 + 1, x, y, mij + 1, dr);
    else
        return max( query(nod * 2, x, mij, st, mij), query(nod * 2 + 1, mij + 1, y, mij + 1, dr) );
}

inline void update( int poz, int val ) {
    int mx, t;
    poz = p + poz - 1;
    a[poz] = val;
    while ( poz > 0 ) {
        t = poz / 2;
        mx = max(a[2 * t], a[2 * t + 1]);
        poz = t;
        a[t] = mx;
    }
}

int main()
{
    f >> n >> m;
    p = 1;
    while ( (p<<=1) <= n );
    for ( int i = 1; i <= n; i++ )
        f >> a[p + i - 1];
    for ( int i = p - 1; i >= 1; i-- )
        a[i] = max(a[2 * i], a[2 * i + 1]);
    for ( int i = 1; i <= m; i++ ) {
        f >> tip >> x >> y;
        if ( tip == 0 )
            g << query(1, x, y, 1, p) << '\n';
        else
            update(x, y);
    }
    f.close();
    g.close();
    return 0;
}