Cod sursa(job #1394056)

Utilizator danalex97Dan H Alexandru danalex97 Data 19 martie 2015 23:10:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <fstream>
#include <iostream>
#include <cstdio>

using namespace std;

#define dim 100010
#define DBG 0

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

FILE* in = fopen("arbint.in","r");
FILE* out = fopen("arbint.out","w");

int Arb[4*dim],i,j,n,m,pos,x,y,val,q,ans,start,finish,v[dim];

void _Update(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[ nod ] = val;
        return;
    }

    int middle = ( left + right ) / 2;

    if( pos <= middle )
        _Update( 2 * nod , left , middle );
    else
        _Update( 2 * nod + 1 , middle + 1 , right );

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

void _Query(int nod, int left, int right)
{
    if ( start > right || finish < left ) return;

    if( left >= start && right <= finish )
    {
        if( ans < Arb[ nod ] )
            ans = Arb[ nod ];
        return;
    }

    if( left == right )
        return;


    int middle = ( left + right ) / 2;

    if ( start <= middle ) _Query( 2 * nod , left , middle );
    if ( finish >  middle) _Query( 2 * nod + 1 , middle + 1 , right );
}

void _Build(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[ nod ] = v[ left ];
        return;
    }

    int middle = ( left + right ) / 2;

    _Build( 2 * nod , left , middle );
    _Build( 2 * nod + 1 , middle + 1 , right );

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

int main()
{
    fscanf(in,"%d %d",&n,&m);
    for(i=1 ; i<=n ; ++i)
        fscanf(in,"%d",&v[i]);

    _Build( 1 , 1 , n );

    for(i=1 ; i<=m ; ++i)
    {
        fscanf(in,"%d %d %d",&q,&x,&y);
        if( q == 1 )
        {
            pos = x;
            val = y;
            _Update( 1 , 1 , n );
            if(DBG)
                cerr<<"update "<<i<<'\n';
        }
        else
        {
            ans = -1;
            start = x;
            finish = y;
            _Query( 1 , 1 , n );
            fprintf(out,"%d\n",ans);
            if(DBG)
                cerr<<"query  "<<i<<'\n';
        }
    }

return 0;
}