Cod sursa(job #2673804)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 17 noiembrie 2020 19:31:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>

#define NMAX 100001

using namespace std;

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

int tree[4*NMAX];
int v[NMAX];
int N, Q, op, x, y;

void Build( int nod, int lf, int rg )
{
    //cout << nod << ' ' << lf << ' ' << rg << '\n';
    if( lf == rg )
    {
        tree[nod] = v[lf];
        return;
    }
    int mid = lf + ( rg - lf )/ 2;
    Build( nod<<1, lf, mid );
    Build( nod<<1|1, mid+1, rg );
    tree[nod] = max( tree[nod<<1], tree[nod<<1|1 ]);
}

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 ans1,ans2;
    ans1 = ans2 = 0;

    if( L <= mid ) ans1 = Query( nod*2, lf, mid, L, R );
    if( mid < R ) ans2 = Query( nod*2+1, mid+1, rg, L, R);

    return max(ans1, ans2 );
}

void Solve()
{
    fin >> N >> Q;

    for( int i = 1; i <= N; ++i )
        fin >> v[i];
    Build( 1, 1, N );

    for( int q = 1; q <= Q; ++q )
    {
        fin >> op >> x >> y;

        if( op == 0 )
        {
            fout << Query( 1, 1, N, x, y ) << '\n';
        }
        else
        {
            Update( 1, 1, N, x, y );
        }
    }
}
int main()
{
    Solve();
    return 0;
}