Cod sursa(job #2158074)

Utilizator Kappa_AlexAlexoi David Kappa_Alex Data 10 martie 2018 10:20:33
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN=100041 ;
int n , m ;
int a[MAXN] , arbint[4*MAXN] ;

void citire()
{
    fin>>n>>m ;
    for(int i=1 ; i<=n ; i++)
        fin>>a[i] ;
}
void constructie(int st=1 , int dr=n  , int nod=1)
{
    if(st==dr)
        arbint[nod]=a[st] ;
    else
    {
        int mij=(st+dr)/2 ;
        constructie(st,mij,nod*2) ;
        constructie(mij+1,dr,nod*2+1) ;
        arbint[nod]=max(arbint[nod*2] , arbint[nod*2+1]) ;
    }
}
void update(int pos , int val , int st=1 , int dr=n , int nod=1)
{
    if(st==dr)
    {
        arbint[nod]=val ;
    }
    else
    {
        int mij=(st+dr)/2 ;
        if(pos<=mij)
            update(pos,val,st,mij,2*nod) ;
        else
            update(pos,val,mij+1,dr,2*nod+1) ;
        arbint[nod]=max(arbint[nod] , arbint[2*nod+1]) ;
    }
}
int query(int qst , int qdr , int st=1 , int dr=n , int nod=1)
{
    if(qst<=st && dr<=qdr)
        return arbint[nod] ;
    int mij=(st+dr)/2 ;
    if(qdr<=mij)
        return query(qst,qdr,st,mij,nod*2) ;
    if(qst>=mij+1)
        return query(qst,qdr,mij+1,dr,nod*2+1) ;
    return max(query(qst,qdr,st,mij,nod*2) , query(qst,qdr,mij+1,dr,nod*2+1)) ;
}

int main()
{
    citire() ;
    constructie(1,n) ;
    for(int i=1 ; i<=m ; i++)
    {
        int op , a , b ;
        fin>>op>>a>>b ;
        if(op==0)
            fout<<query(a,b)<<"\n" ;
        else
            update(a,b) ;
    }
    return 0;
}