Cod sursa(job #905987)

Utilizator swim406Teudan Adina swim406 Data 6 martie 2013 13:13:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define nmax 100001

int arb[3*nmax+66], pos, val, start, finish, maxim;

void update (int nod, int left, int right) {
    if (left == right) {
        arb[nod] = val;
        return;
    }

    int div = (left + right)/2;
    if (pos <= div) update (2*nod, left, div);
    else update (2*nod+1, div + 1, right);

    arb[nod] = max (arb[2*nod], arb[2*nod+1]);
}

void query (int nod, int left, int right) {
    if (left >= start && right <= finish) {
        if (maxim < arb[nod]) maxim = arb[nod];
        return;
    }

    int div = (left+right)/2;
    if (start <= div) query (2*nod, left, div);
    if (div < finish) query (2*nod+1, div+1, right);

}

int main() {
    freopen ("arbint.in", "r", stdin);
    freopen ("arbint.out", "w", stdout);
    int N, M, i, X, A, B;
    scanf ("%d %d", &N, &M);
    for (i = 1; i <= N; ++i) {
        scanf ("%d", &X);
        val = X;
        pos = i;
        update (1, 1, N);
    }

    for (i = 1; i <= M; ++i) {
        scanf ("%d %d %d", &X, &A, &B);
        if (X != 0) {
            pos = A;
            val = B;
            update (1, 1, N);
        }
        else {
            start = A;
            finish = B;
            maxim = - 1;
            query (1, 1, N);
            printf ("%d\n", maxim);
        }
    }
    return 0;
}