Cod sursa(job #3285637)

Utilizator MMEnisEnis Mutlu MMEnis Data 13 martie 2025 11:50:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

int maxx;
int v[100001], aint[400001];


void build( int nod, int st, int dr )
{
    if ( st == dr )
    {
        aint[nod] = v[st];
        return;
    }
    int m = ( st + dr ) / 2;
    build ( nod * 2, st, m );
    build ( nod * 2 + 1, m + 1, dr );
    aint[nod] = max ( aint[nod * 2], aint[nod * 2 + 1] );
}

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

void query( int nod, int st, int dr, int a, int b )
{
    if ( st > b || dr < a )
        return;
    if ( a <= st && dr <= b )
    {
        maxx = max( maxx, aint[nod] );
        return;
    }
    int m = ( st + dr ) / 2;
    query( nod * 2, st, m, a, b );
    query( nod * 2 + 1, m + 1, dr, a, b );
}

int main()
{
    int n, q, i;
    f >> n >> q;
    for ( i = 1; i <= n; i ++ )
        f >> v[i];
    build( 1, 1, n );
    while ( q -- )
    {
        int c, a, b;
        f >> c >> a >> b;
        if ( c == 0 )
        {
            query( 1, 1, n, a, b );
            g << maxx << '\n';
            maxx = 0;
        }
        else
        {
            update( 1, 1, n, a, b );
        }
    }
    return 0;
}