Cod sursa(job #2456327)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 14 septembrie 2019 10:42:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 100001;

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

int N, Q;
int tree[4 * NMAX ];

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 x;
    fin >> N >> Q;

    for( int i = 1; i <= N; ++i )
    {
        fin >> x;
        Update(1, 1, N, i, x );
    }

    for( int i = 1; i <= Q; ++i )
    {
        int a, b;
        fin >> x >> a >> b;

        if( x == 0 )
        {
            fout << Query( 1, 1, N, a, b ) << '\n';
        }
        else Update( 1, 1, N, a, b );
    }
}
int main()
{
    Read();
    return 0;
}