Cod sursa(job #2952047)

Utilizator TanasaStefanTanasa Stefan TanasaStefan Data 8 decembrie 2022 09:25:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int arbore[500005] , n , m;

int  left , right , start , finish , maxim , op , pos , val ;

int Maxim(int a, int b)
{
       if ( a > b ) return a;
       return b;
}

void update( int nod , int left , int right)
{
    if ( left == right )
    {
        arbore[nod] = val;
        return;
    }

    int mid = (left + right) / 2;

    if(pos <= mid)
        update(2 * nod , left , mid);
    else
        update(2 * nod + 1 , mid + 1 , right);
    arbore[nod] = Maxim( arbore[2 * nod] , arbore[2 * nod + 1]);
}

void query (int nod , int left , int right)
{
    if( start <= left && right <= finish)
    {
        if(maxim < arbore[nod])
            maxim = arbore[nod];
        return;
    }

    int mid = (left + right) / 2;

    if( start <= mid)
        query(2 * nod , left , mid);

    if(mid < finish)
        query(2 * nod + 1 , mid + 1 , right);

}

int main()
{
    int x , a , b;
    f >> n >> m;
    for ( int i = 1 ; i <= n ; i++)
    {
        f >> x;
        pos = i;
        val = x;
        update(1 , 1 , n);
    }
    for (int i = 1 ; i <= m ; i++)
    {
        f >> op >> a >> b;
        if( op == 0)
        {
            maxim = -1;
            start = a;
            finish = b;
            query(1 , 1 , n);

            g << maxim << '\n';
        }
        else
        {
            pos = a;
            val = b;
            update(1 , 1 , n);
        }
    }
}