Cod sursa(job #1824255)

Utilizator NineshadowCarapcea Antonio Nineshadow Data 7 decembrie 2016 17:02:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int N, M, arb[400070],start, finish, Val, Pos, maxim,X, A, B;
void Update(int nod, int left, int right)
{
    if ( left == right )
    {
        arb[nod] = Val;
        return;
    }

    int div = (left+right)/2;
    if ( Pos <= div ) Update(2*nod,left,div);
    else Update(2*nod+1,div+1,right);

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

void Query(int nod, int left, int right)
{
    if ( start <= left && right <= finish )
    {
        if ( maxim < arb[nod] ) maxim = arb[nod];
        return;
    }
    int div = (left+right)/2;
    if ( start <= div ) Query(2*nod,left,div);
    if ( div < finish ) Query(2*nod+1,div+1,right);
}

int main()
{
    in>>N>>M;
    for (int i=1;i<=N; i++)
    {
        in>>X;
        Pos =i,Val =X;
        Update(1,1,N);
    }
    for ( int i = 1; i <= M; i++ )
    {
        in>>X>>A>>B;
        if (X == 0)
        {
            maxim =-1;
            start =A, finish =B;
            Query(1,1,N);
            out<<maxim<<'\n';
        }
        else
        {
            Pos =A,Val =B;
            Update(1,1,N);
        }
    }
}