Cod sursa(job #3272582)

Utilizator SimifilLavrente Simion Simifil Data 29 ianuarie 2025 23:18:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int n = 100000;
int aint[4*n+1], v[n+1];

void build( int nod, int left, int right )
{
    if( left == right )
        aint[nod] = v[left];
    else
    {
        int mij = left + (right-left)/2;
        build( nod*2, left, mij );
        build( nod*2+1, mij+1, right );
        aint[nod] = max(aint[nod*2], aint[nod*2+1]);
    }
}

int query( int nod, int qleft, int qright, int mleft, int mright )
{
    if( qleft <= mleft && mright <= qright )
        return aint[nod];
    else
    {
        int mij = mleft + (mright-mleft)/2, ans = 0;
        if( qleft <= mij )
            ans = max(ans, query( nod*2, qleft, qright, mleft, mij ));
        if( mij < qright )
            ans = max(ans, query( nod*2+1, qleft, qright, mij+1, mright));
        return ans;
    }
}

void update( int nod, int mleft, int mright, int ind, int val )
{
    if( mleft == mright && mleft == ind )
    {
        aint[nod] = val;
    }
    else
    {
        int mij = mleft + (mright-mleft)/2;
        if( ind <= mij )
            update( nod*2, mleft, mij, ind, val );
        else
            update( nod*2+1, mij+1, mright, ind, val );
        aint[nod] = max(aint[nod*2], aint[nod*2+1]);
    }
}

int main() {
	int n, m;
    f >> n >> m;
    for( int i = 1; i <= n; ++i )
        f >> v[i];
    build( 1, 1, n );
    for( int i = 1; i <= m; ++i )
    {
        int a, b, c;
        f >> a >> b >> c;
        if( a == 0 )
        {
            g << query(1, b, c, 1, n) << "\n";
        }
        else
        {
            update( 1, 1, n, b, c );
        }
    }
}