Cod sursa(job #1039031)

Utilizator gallexdAlex Gabor gallexd Data 22 noiembrie 2013 13:48:35
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <cstring>

#define INF (~(1<<31))
#define MAX(a,b) ((a<b)? (b): (a))

int N, M, maxim;
int a[400000];

void add(int nod, int st, int dr, int poz, int val) {
    if (st == dr) {
        a[nod] = val;
        return;
    } else {
        int mij = (st+dr)/2;
        if (poz <= mij)
            add(nod*2, st, mij, poz, val);
        else
            add(nod*2+1, mij+1, dr, poz, val);
        a[nod] = MAX(a[nod*2],a[nod*2+1]);
    }
}

void cautare(int nod, int st, int dr, int A, int B) {
    if (A<=st && dr<=B) {
        maxim = MAX(maxim, a[nod]);
        return;
    } else {
        int mij = (st+dr)/2;
        if (A<=mij)
            cautare(nod*2, st, mij, A, B);
        if (B>mij)
            cautare(nod*2+1, mij+1, dr, A, B);
    }
}

int main () {

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

    //memset(a, -INF, sizeof(a));

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

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

    for (int tip, poz, val;M;--M) {
        scanf("%d %d %d", &tip, &poz, &val);
        if (tip == 0) {
            maxim = -1;
            cautare(1, 1, N, poz, val);
            printf("%d\n", maxim);
        } else
            add(1, 1, N, poz, val);
    }

    return 0;
}