Cod sursa(job #780820)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 21 august 2012 23:47:15
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int kMaxN = 100005;
const int kMaxIT = 4*kMaxN;

int N, NQ, Value[kMaxN], IT[kMaxIT];

void Build(int K, int L, int R) {
    int Mid = (L+R)/2;
    if (L == R) {
        IT[K] = Value[Mid];
        return;
    }
    Build(2*K, L, Mid), Build(2*K+1, Mid+1, R);
    IT[K] = max(IT[2*K], IT[2*K+1]);
}

void Update(int K, int L, int R, int P, int V) {
    int Mid = (L+R)/2;
    if (L == R) {
        IT[K] = V;
        return;
    }
    if (P <= Mid)
        Update(2*K, L, Mid, P, V);
    else
        Update(2*K+1, Mid+1, R, P, V);
    IT[K] = max(IT[2*K], IT[2*K+1]);
}

int Query(int K, int L, int R, int QL, int QR) {
    int Mid = (L+R)/2;
    if (QL <= L && R <= QR)
        return IT[K];
    int QMax = 0;
    if (QL <= Mid)
        QMax = max(QMax, Query(2*K, L, Mid, QL, QR));
    if (QR > Mid)
        QMax = max(QMax, Query(2*K+1, Mid+1, R, QL, QR));
    return QMax;
}

void Initialize() {
    scanf("%d %d", &N, &NQ);
    for (int i = 1; i <= N; ++i)
        scanf("%d", &Value[i]);
    Build(1, 1, N);
}

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