Cod sursa(job #3259679)

Utilizator David_Popa123Popa David Matei David_Popa123 Data 27 noiembrie 2024 12:27:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "arbint.in" );
ofstream fout( "arbint.out" );

#define MAXN 100000

int aint[4 * MAXN];
int v[MAXN + 1], n;

int fs( int x )
{
    return 2 * x;
}

int fd( int x )
{
    return 2 * x + 1;
}

int op( int a, int b )
{
    return max( a, b );
}

void build( int nod, int st, int dr )
{
    int mij;
    if( st == dr )
    {
        aint[nod] = v[st];
        return ;
    }
    mij = ( st + dr ) / 2;
    build( fs( nod ), st, mij );
    build( fd( nod ), mij + 1, dr );
    aint[nod] = op( aint[fs( nod )], aint[fd( nod )] );
}

void update( int nod, int st, int dr, int poz, int val )
{
    int mij;
    if( st == dr )
    {
        aint[nod] = val;
        return ;
    }
    mij = ( st + dr ) / 2;
    if( poz <= mij )
        update( fs( nod ), st, mij, poz, val );
    else
        update( fd( nod ), mij + 1, dr, poz, val );
    aint[nod] = op( aint[fs( nod )], aint[fd( nod )] );
}

int query( int nod, int st, int dr, int qs, int qd )
{
    int q1, q2, mij;

    if( qs > dr || st > qd )
        return 0;
    if( qs <= st && qd >= dr )
        return aint[nod];
    mij = ( st + dr ) / 2;
    q1 = q2 = 0;
    if( qs <= mij )
        q1 = query( fs( nod ), st, mij, qs, qd );
    if( qd > mij )
        q2 = query( fd( nod ), mij + 1, dr, qs, qd );
    return op( q1, q2 );
}

int main()
{
    int n, m, t, x, y, i;

    fin >> n >> m;
    for( i = 1; i <= n; i++ )
        fin >> v[i];

    build( 1, 1, n );

    for( i = 1; i <= m; i++ )
    {
        fin >> t >> x >> y;
        if( t == 0 )
            fout << query( 1, 1, n, x, y ) << '\n';
        else
            update( 1, 1, n, x, y );
    }
    return 0;
}