Cod sursa(job #3330771)

Utilizator MMEnisEnis Mutlu MMEnis Data 21 decembrie 2025 22:37:05
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

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

int arb[200001];
int v[100001];
int maxx;

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

void update ( int nod, int st, int dr, int poz, int val )
{
    if ( st == dr )
    {
        arb[nod] = val;
        return;
    }
    int mij = ( st + dr ) / 2;
    if ( poz <= mij )
        update ( 2 * nod, st, mij, poz, val );
    else update ( 2 * nod + 1, mij + 1, dr, poz, val );
    arb[nod] = max ( arb[nod * 2], arb[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, arb[nod] );
        return;
    }
    int mij = ( st + dr ) / 2;
    query ( 2 * nod, st, mij, a, b );
    query ( 2 * nod + 1, mij + 1, dr, a, b );
}

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