Cod sursa(job #642620)

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

int MaxArb[5*NMax];
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()
{
	freopen(inf,"r",stdin); freopen(outf,"w",stdout);

	scanf("%d%d", &N, &M);
    for(int i=1; i<=N; i++)
    {
        scanf("%d", &value);
        pos = i;
        Update(1,1,N);
    }
    //printf("%d", MaxArb[1]);

    int op, A, B;
    for(int i=1; i<=M; i++)
    {
        scanf("%d%d%d", &op, &A, &B);
        if( !op )
        {
            maxim = -1;
            start = A; end = B;
            Query(1,1,N);
            printf("%d\n", maxim);
        }
        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);
}