Cod sursa(job #2172496)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 15 martie 2018 16:47:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in") ;
ofstream fout("arbint.out") ;
int n , m ,arb[400001] ;
int val , poz , start , finish ,sol;

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 <= finish )
    {
        if ( arb[nod] > sol )
            sol = arb[nod] ;
        return ;
    }
    int med = (left+right)/2 ;
    if ( start <= med )
        maxim(2*nod,left,med) ;
    if ( med < finish )
        maxim(2*nod+1,med+1,right) ;
}

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