Cod sursa(job #357513)

Utilizator Dr.OptixCristian Dinu Dr.Optix Data 19 octombrie 2009 17:22:42
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
//Problema: http://infoarena.ro/problema/arbint

#include <stdio.h>

//Global data
int N,M;
int ArbInt[4 * 100001 + 10],A,Val,B,Max,Pos;

//Prototypes
void UpdateArbInt(int Nod, int St, int Dr);
int MaxBetween(int X, int Y);
void MaxFromInterval(int Nod, int St, int Dr);

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d", &N, &M);
    for(int i = 1; i<=N; ++i)
    {
        scanf("%d", &Val);
        Pos = i;
        UpdateArbInt(1,1,N);
    }

    int _oper, _x, _y;
    for(int i=1; i<=M; ++i)
    {
        scanf("%d%d%d",&_oper,&_x,&_y);

        Max = -1;

        if(_oper == 0)
        {
            A=_x;
            B=_y;
            MaxFromInterval(1,1,N);
            printf("%d\n",Max);
        }
        else
        {
            Pos=_x;
            Val=_y;
            UpdateArbInt(1,1,N);
        }
    }

    return 0;
}


//Functions and routines
void UpdateArbInt(int Nod, int St, int Dr)
{
    if(St==Dr)
    {
        ArbInt[Nod] = Val;
        return;
    }

    int _mij = (St+Dr)/2;

    if(Pos<=_mij)
        UpdateArbInt(2*Nod, St, _mij);
    if(Pos>_mij)
        UpdateArbInt(2*Nod+1, _mij+1, Dr);

    ArbInt[Nod] = MaxBetween(2*Nod,2*Nod+1);
}

int MaxBetween(int X, int Y)
{
    if(X>Y)
        return X;
    return Y;
}

void MaxFromInterval(int Nod,int St,int Dr)
{
    if(St>=A && Dr<=B)
    {
        if(ArbInt[Nod]>Max)
            Max = ArbInt[Nod];
        return ;
    }
    int _mij=(St+Dr)/2;
    if(A<=_mij)
        MaxFromInterval(2*Nod,St,_mij);
    if(_mij<B)
        MaxFromInterval(2*Nod+1,_mij+1,Dr);
}