Cod sursa(job #892830)

Utilizator visanrVisan Radu visanr Data 26 februarie 2013 11:50:04
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define Nmax 100010
#define LeftSon (Node << 1)
#define RightSon ((Node << 1) + 1)

int Aint[4 * Nmax], Pos, Val, N, M, X, Y, Type;

void Update(int Node, int Left, int Right)
{
    if(Left == Right)
    {
        Aint[Node] = Val;
        return ;
    }
    int Mid = (Left + Right) / 2;
    if(Pos <= Mid) Update(LeftSon, Left, Mid);
    else Update(RightSon, Mid + 1, Right);
    Aint[Node] = max(Aint[LeftSon], Aint[RightSon]);
}

int Query(int Node, int Left, int Right)
{
    if(X <= Left && Right <= Y) return Aint[Node];
    int Mid = (Left + Right) / 2, Ans = 0;
    if(X <= Mid) Ans = max(Ans, Query(LeftSon, Left, Mid));
    if(Mid < Y) Ans = max(Ans, Query(RightSon, Mid + 1, Right));
    return Ans;
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int i;
    scanf("%i %i", &N, &M);
    for(i = 1; i <= N; ++i)
    {
        scanf("%i", &X);
        Pos = i, Val = X;
        Update(1, 1, N);
    }
    for(i = 1; i <= M; ++i)
    {
        scanf("%i %i %i", &Type, &X, &Y);
        if(Type == 0) printf("%i\n", Query(1, 1, N));
        else
        {
            Pos = X;
            Val = Y;
            Update(1, 1, N);
        }
    }
    return 0;
}