Cod sursa(job #1471572)

Utilizator theep0Cruceru Radu theep0 Data 14 august 2015 14:22:13
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.73 kb
#include <stdio.h>
#include <stdlib.h>

#define AIL 131072

int *arb;
int N, M, a, arbsz;
int *vals;

int max(int a, int b) {
    return a > b ? a : b;
}

void build(int idx, int l, int r) {
    int m;
    if (l == r) {
        arb[idx] = vals[l];
    } else {
        m = (r + l)/2;
        build(idx * 2, l, m);
        build(idx * 2 + 1, m + 1, r);
        arb[idx] = max(arb[idx * 2], arb[idx * 2 + 1]);
    }
}

void update(int idx, int l, int r, int n, int v) {
    int m, nm;
    if (l == r) {
        arb[idx] = v;
    } else {
        m = (r + l)/2;
        if (n <= m) {
            update(idx * 2, l, m, n, v);
        } else {
            update(idx * 2 + 1, m + 1, r, n, v);
        }
        arb[idx] = max(arb[idx * 2], arb[idx * 2 + 1]);
    }
}

int answer(int idx, int l, int r, int ql, int qr) {
    int m, lm = 0, rm = 0;
    if (ql <= l && qr >= r) {
        return arb[idx];
    } else {
        m = (l + r ) / 2;
        if (ql <= m) {
            lm = answer(idx * 2, l, m, ql, qr);
        }
        if (qr > m) {
            rm = answer(idx * 2 + 1, m + 1, r, ql, qr);
        }
        return max(lm, rm);
    }
}

int main() {
    int i, j;
    int op, n, v;
    arbsz = 1;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d %d\n", &N, &M);
    while (arbsz < 3 * N - 1) arbsz <<= 1;
    arb = (int*) malloc(sizeof(int) * (arbsz + 1));
    vals = (int*) malloc(sizeof(int) * (N + 1));
    for (i = 1; i <= N; i++) {
        scanf("%d", vals + i);
    }
    build(1, 1, N);
    for(i = 1; i <= M; i++) {
        scanf("%d %d %d", &op, &n, &v);
        if (op == 1) {
            update(1, 1, N, n, v);
        } else {
            printf("%d\n", answer(1, 1, N, n, v));
        }
    }

    return 0;
}