Cod sursa(job #1184878)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 14 mai 2014 13:05:08
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>

using namespace std;

#define MaxN 100050

int arb[MaxN*2];

int pos, val;
int pos1, pos2;

int max2( int a, int b )
{
    if ( a > b )
        return a;
    return b;
}

void Update( int nod, int st, int dr )
{
    if ( st == dr )
         arb[nod] = val;
    else
    {
        int div = ( st + dr ) >> 1;

        if ( pos <= div )
            Update( nod << 1, st, div );
        else
            Update( ( nod << 1 ) + 1, div + 1, dr );

        arb[nod] = max2( arb[ nod << 1 ], arb[ ( nod << 1 ) + 1 ] );
    }
}

void Query( int nod, int st, int dr )
{
    if ( ( st >= pos1 ) && ( dr <= pos2 ) )
    {
        if ( arb[nod] > val )
            val = arb[nod];
    }
    else
    {
        int mid =  ( st + dr ) >> 1;
        if ( mid >= pos1 )
            Query( nod << 1, st, mid );
        if ( mid < pos2 )
            Query( ( nod << 1 ) + 1, mid + 1, dr );
    }
}

int main()
{
    ifstream f1( "arbint.in" );
    ofstream f2( "arbint.out" );

    int n, m, i;

    f1 >> n >> m;

    for ( i = 1; i <= n; ++i )
    {
        pos = i;
        f1 >> val;

        Update( 1, 1, n );
    }

    short a;

    for ( i = 1; i <= m; ++i )
    {
        f1 >> a;

        if ( a )
        {
            f1 >> pos >> val;
            Update( 1, 1, n );
        }
        else
        {
            f1 >> pos1 >> pos2;
            val = 0;
            Query( 1, 1, n );
            f2 << val << '\n';
        }
    }


    f1.close();
    f2.close();

    return 0;
}