Cod sursa(job #604351)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 21 iulie 2011 21:56:36
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>

#define NMax 100005

using namespace std;

int N, ArbInt[4*NMax];

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

void Update (int K, int L, int R, int Poz, int Value)
{
    int Mid=(L+R)/2;
    if (L==R)
    {
        ArbInt[K]=Value;
        return;
    }
    if (Poz<=Mid)
    {
        Update (2*K, L, Mid, Poz, Value);
    }
    else
    {
        Update (2*K+1, Mid+1, R, Poz, Value);
    }
    ArbInt[K]=Max (ArbInt[2*K], ArbInt[2*K+1]);
}

int Query (int K, int L, int R, int QL, int QR)
{
    int Mid=(L+R)/2;
    if (L==QL and R==QR)
    {
        return ArbInt[K];
    }
    if (QR<=Mid)
    {
        return Query (2*K, L, Mid, QL, QR);
    }
    if (QL>Mid)
    {
        return Query (2*K+1, Mid+1, R, QL, QR);
    }
    return Max (Query (2*K, L, Mid, QL, Mid), Query (2*K+1, Mid+1, R, Mid+1, QR));
}

int main()
{
    freopen ("arbint.in", "r", stdin);
    freopen ("arbint.out", "w", stdout);
    int NQ;
    scanf ("%d %d", &N, &NQ);
    for (int i=1; i<=N; ++i)
    {
        int X;
        scanf ("%d", &X);
        Update (1, 1, N, i, X);
    }
    for (; NQ>0; --NQ)
    {
        int Type, A, B;
        scanf ("%d %d %d", &Type, &A, &B);
        if (Type==0)
        {
            printf ("%d\n", Query (1, 1, N, A, B));
        }
        else
        {
            Update (1, 1, N, A, B);
        }
    }
    return 0;
}