Cod sursa(job #3215740)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 15 martie 2024 12:21:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX = 1e5 + 5;
int aint[4 * NMAX], v[NMAX];
void update( int poz ){
    if( poz == 0 )
        return ;
    aint[poz] = max(aint[poz*2], aint[poz*2 + 1]);
    update(poz/2);
}
int query( int poz, int st, int dr, int qst, int qdr ){
    if( dr < qst || st > qdr )
        return 0;
    if( st >= qst && dr <= qdr )
        return aint[poz];

    int mij = ( st + dr ) / 2;
    return  max(query(poz * 2, st, mij, qst, qdr ),
                query(poz * 2 + 1, mij+1, dr, qst, qdr ));
}
int main()
{
    int n, m;
    in >> n >> m;
    int p1 = 1;
    while( p1 <= n )
        p1 *= 2;

    for( int i = 1; i <= n; i++ ){
        in >> v[i];
        aint[i + p1 - 1] = v[i];
    }
    for( int i = p1; i < p1 + n; i++ )
        update(i/2);

    while( m-- ){
        int cer, a, b;
        in >> cer >> a >> b;
        if( cer == 0 )
            out << query( 1, 1, p1, a, b ) << endl;
        else{
            int poz = p1 + a - 1;
            aint[poz] = b;
            update(poz / 2);
        }
    }
    return 0;
}