Cod sursa(job #1118773)

Utilizator visanrVisan Radu visanr Data 24 februarie 2014 13:11:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define LeftSon (2 * Node)
#define RightSon (2 * Node + 1)

const int NMAX = 100010;

int N, M, Type, A, B, Max, V[NMAX], Aint[4 * NMAX];

void Build(int Node, int Left, int Right)
{
    if(Left == Right)
    {
        Aint[Node] = V[Left];
        return ;
    }
    int Mid = (Left + Right) / 2;
    Build(LeftSon, Left, Mid);
    Build(RightSon, Mid + 1, Right);

    Aint[Node] = max(Aint[LeftSon], Aint[RightSon]);
}

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

    Aint[Node] = max(Aint[LeftSon], Aint[RightSon]);
}

void Query(int Node, int Left, int Right)
{
    if(A <= Left && Right <= B)
    {
        Max = max(Max, Aint[Node]);
        return ;
    }
    int Mid = (Left + Right) / 2;
    if(A <= Mid) Query(LeftSon, Left, Mid);
    if(Mid < B) Query(RightSon, Mid + 1, Right);
}

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

    scanf("%i %i", &N, &M);
    for(int i = 1; i <= N; ++ i) scanf("%i", &V[i]);

    Build(1, 1, N);

    for(; M; M --)
    {
        scanf("%i %i %i", &Type, &A, &B);
        if(Type == 0)
        {
            Max = 0;
            Query(1, 1, N);
            printf("%i\n", Max);
        }else Update(1, 1, N);
    }
}