Cod sursa(job #2456326)

Utilizator davidbejenariu2David Bejenariu davidbejenariu2 Data 14 septembrie 2019 10:41:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define N 1000005

using namespace std;

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

int n, m;
int tree[4*N];

void update( int nod, int lf, int rg, int pos, int val )
{
    if ( lf == rg )
    {
        tree[nod] = val;

        return;
    }

    int mid = lf + ( rg - lf ) / 2;

    if ( pos <= mid ) update( nod * 2, lf, mid, pos, val );
    else update( nod * 2 + 1, mid + 1, rg, pos, val );

    tree[nod] = max( tree[nod*2], tree[nod*2+1] );
}

int query( int nod, int lf, int rg, int L, int R )
{
    if ( L <= lf && rg <= R ) return tree[nod];

    int mid = lf + ( rg - lf ) / 2;
    int maxi = -1;

    if ( L <= mid ) maxi = max( maxi, query( nod * 2, lf, mid, L, R ) );
    if ( mid < R ) maxi = max( maxi, query( nod * 2 + 1, mid + 1, rg, L, R ) );

    return maxi;
}

void read()
{
    int i, tip, a, b;

    fin >> n >> m;

    for ( i = 1; i <= n; ++i )
    {
        fin >> a;

        update( 1, 1, n, i, a );
    }

    for ( i = 1; i <= m; ++i )
    {
        fin >> tip >> a >> b;

        if ( tip == 0 ) fout << query( 1, 1, n, a, b ) << '\n';
        else update( 1, 1, n, a, b );
    }
}

int main()
{
    read();

    fout.close();

    return 0;
}