Cod sursa(job #2151738)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 4 martie 2018 20:58:13
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

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

int arb[200001] ;
int poz , val , n , m , maxrez , start , finall ;

void afis()
{
    for (int i = 1 ; i < 2*n ; i++ )
        cout << arb[i] << " " ;
    cout << endl ;
}

void schimb(int nod , int left , int right )
{
    if ( left == right )
    {
        arb[nod] = val ;
        return ;
    }
    int med = (left+right)/2 ;
    if ( poz <= med )
        schimb(2*nod,left,med) ;
    else
        schimb(2*nod+1,med+1,right) ;
    arb[nod] = max(arb[2*nod],arb[2*nod+1]) ;
}

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

int main()
{
    int i , test;
    fin >> n >> m ;
    for ( i = 1 ; i <= n ; i++ )
    {
        fin >> val ;
        poz = i ;
        schimb(1,1,n) ;
    }
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> test ;
        if ( test == 0 )
        {
            fin >> start >> finall ;
            maxrez = -1 ;
            maxim(1,1,n) ;
            fout << maxrez << '\n' ;
        }
        else
        {
            fin >> poz >> val ;
            schimb(1,1,n) ;
        }
    }
}