Cod sursa(job #642632)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 1 decembrie 2011 20:29:25
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
#define inf "arbint.in"
#define outf "arbint.out"
#define NMax 100000
using namespace std;

fstream f(inf, fstream::in), g(outf, fstream::out);

int MaxArb[4*NMax+100];
int N, M;
int start, end, value, pos, maxim;

inline int Max(int a, int b) { return ( a>b ? a : b ); }

void Update(int, int, int);
void Query(int, int, int);

int main()
{
	f>>N>>M;
    for(int i=1; i<=N; i++)
    {
        f>>value;
        pos = i;
        Update(1,1,N);
    }

    int op, A, B;
    for(int i=1; i<=M; i++)
    {
        f>>op>>A>>B;
        if( !op )
        {
            maxim = -1;
            start = A; end = B;
            Query(1,1,N);
            g<<maxim<<"\n";
        }
        else
        {
            pos = A; value = B;
            Update(1,1,N);
        }
    }

	return 0;
}

void Update(int nod, int left, int right)
{
    if( left==right )
    {
        MaxArb[nod] = value;
        return;
    }

    int m = (left+right)/2;
    if( pos<=m ) Update(2*nod, left, m);
    else Update(2*nod+1, m+1, right);

    MaxArb[nod] = Max( MaxArb[2*nod], MaxArb[2*nod+1] );
}

void Query(int nod, int left, int right)
{
    if( right<=end && left>=start )
    {
        maxim = Max( maxim, MaxArb[nod] );
        return;
    }

    int m = (left+right)/2;
    if( start<=m ) Query(2*nod, left, m);
    if( end > m ) Query(2*nod+1, m+1, right);
}