Cod sursa(job #1412074)

Utilizator BaTDucKMocanu George BaTDucK Data 1 aprilie 2015 09:13:13
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<bits/stdc++.h>

#define Nmax 100005

using namespace std;

int N, M, Arb[Nmax * 4], maxim = 0;

void Uptade(int Nod, int st, int dr, int X, int ind)
{
    if(st == dr) {
        Arb[Nod] = X;
        return;
    }

    int mid = (st + dr) / 2;
    if(ind <= mid)
        Uptade(2*Nod, st, mid, X, ind);
    else
        Uptade(2*Nod + 1, mid + 1, dr, X, ind);

    Arb[Nod] = max(Arb[Nod * 2], Arb[Nod * 2 + 1]);
}

void Query(int Nod, int st, int dr, int X, int Y)
{
    if(X <= st && dr <= Y) {
        maxim = max(maxim, Arb[Nod]);
        return ;
    }

    int mid = (st + dr) / 2;
    if(X <= mid)
        Query(2 * Nod, st, mid, X, Y);
    else
        Query(2 * Nod + 1, mid + 1, dr, X, Y);
}

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

    scanf("%d %d", &N, &M);

    for(int  i = 1; i <= N; ++ i) {
        int X;
        scanf("%d", &X);
        Uptade(1, 1, N, X, i);
    }

    for( ; M; -- M) {
        int A, B, tip;
        scanf("%d %d %d", &tip, &A, &B);
        if(tip)
            Uptade(1, 1, N, B, A);
        else
            maxim = 0,
            Query(1, 1, N, A, B),
            printf("%d\n", maxim);
    }

    return 0;
}