Cod sursa(job #2646123)

Utilizator matei8787Matei Dobrea matei8787 Data 31 august 2020 00:19:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include<bits/stdc++.h>
using namespace std;
const int NMAX = 100005;
int v[4*NMAX],val,poz;
int fiuStanga ( int i ){ return i * 2; }
int fiuDreapta ( int i ) { return i * 2 + 1; }
void build ( int nod , int val , int a , int b , int nodjos )
{
    if ( a == b ){
        v[nod] = val;
        return;
    }
    int mij = ( a + b ) / 2;
    if ( nodjos <= mij ){
        build(fiuStanga(nod) , val , a , mij , nodjos);
    }
    else{
        build(fiuDreapta(nod) , val , mij + 1 , b , nodjos);
    }
    v[nod] = max(v[fiuDreapta(nod)],v[fiuStanga(nod)]);
}
void afisare( int n )
{
    for ( int i = 1 ; i <= n ; i++ ){
        cout<<v[i]<<" ";
    }
}
int query ( int nod , int st , int dr , int a  , int b ){
    if ( st > b ) return -1;
    if ( dr < a ) return -1;
    if ( st >= a && dr <= b ){
        return v[nod];
    }
    return max(query(fiuStanga(nod),st,(st+dr)/2,a,b),query(fiuDreapta(nod),(st+dr)/2+1,dr,a,b));
}
ifstream in ( "arbint.in" );
ofstream out ( "arbint.out" );
int main()
{
    int n;
    int m;
    in>>n>>m;
    for ( int i = 1 ; i <= n ; i++ ){
        int nr;
        in>>nr;
        build(1,nr,1,n,i);
    }
    for ( int i = 1 ; i <= m ; i++ ){
        int p , a , b;
        in>>p>>a>>b;
        if ( p == 1 ){
            build(1,b,1,n,a);
        }
        if ( p == 0 ){
            out<<query(1,1,n,a,b)<<'\n';
        }
    }
    return 0;
}