Cod sursa(job #2686281)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 18 decembrie 2020 20:32:27
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ( "arbint.in" );
ofstream g ( "arbint.out" );
const int NMAX = 100011;
int a[NMAX], mx[8 * NMAX];
int sz = 1;
void build ( int l, int r, int x )
{
    if ( r - l == 1 )
    {
        if ( l < 2 * sz - 1 )
            mx[x] = a[l];
        else mx[x] = INT_MIN;

        return;
    }

    int m = ( l + r ) / 2;
    build ( l, m, 2 * x + 1 );
    build ( m, r, 2 * x + 2 );
    mx[x] = max ( mx[2 * x + 1], mx[2 * x + 2] );
}
int MX ( int l, int r, int x, int lx, int rx )
{
    if ( lx >= l && rx <= r )
        return mx[x];

    if ( rx <= l || lx >= r )
        return INT_MIN;

    int m = ( rx + lx ) / 2;
    int mx1 = MX ( l, r, 2 * x + 1, lx, m );
    int mx2 = MX ( l, r, 2 * x + 2, m, rx );
    return max ( mx1, mx2 );
}
void sett ( int i, int val, int x, int lx, int rx )
{
    if ( rx - lx == 1 )
    {
        mx[x] = val;
        return;
    }

    int m = ( lx + rx ) / 2;

    if ( i < m )
        sett ( i, val, 2 * x + 1, lx, m );
    else sett ( i, val, 2 * x + 2, m, rx );

    mx[x] = max ( mx[2 * x + 1], mx[2 * x + 2] );
}
int main()
{
    int N, M;
    f >> N >> M;

    for ( int i = 0; i < N; i++ )
        f >> a[i];

    while ( sz < N )
        sz *= 2;

    build ( 0, sz, 0 );

    while ( M-- )
    {
        int op, a, b;
        f >> op >> a >> b;

        if ( op == 0 )
        {
            g << MX ( a - 1, b, 0, 0, sz ) << '\n';
        }
        else
        {
            sett ( a - 1, b, 0, 0, sz );
        }
    }

    return 0;
}