Cod sursa(job #1252107)

Utilizator js3292618Andrei Mihai js3292618 Data 30 octombrie 2014 13:34:50
Problema Arbori de intervale Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <math.h>

#define IN "arbint.in"
#define OUT "arbint.out"
#define NMAX 200002

static long H[NMAX], N;

long max(long a, long b)
{
    if (a > b)
        return a;
    return b;
}

static void update(long i, long x)
{
    long nod = N + i;

    H[N + i] = x;
    while (nod >>= 1)
        H[nod] = max(H[nod << 1], H[(nod << 1) + 1]);
}

static long query(long nod, long st, long dr, long a, long b)
{
    long mid, s, d;

    if (a <= st && dr <= b)
        return H[nod];
    else {
        mid = st + (dr - st) / 2;
        s = d = 0;
        if (a <= mid)
            s = query(2 * nod, st, mid, a, b);
        if (b > mid)
            d = query(2 * nod + 1, mid + 1, dr, a, b);
        return max(s, d);
    }
}

int main(void)
{
    long n, m, i, op, a, b;

    freopen(IN, "r", stdin);
    freopen(OUT, "w", stdout);

    scanf("%ld %ld", &n, &m);
    N = pow(2, (long) log2(n) + 1); /* optimize */

    for (i = 0; i < n; i++) {
        scanf("%d", &H[N + i]);
        update(i, H[N + i]);
    }

    for (i = 0; i < m; i++) {
        scanf("%ld %ld %ld", &op, &a, &b);
        if (op == 0)
            printf("%ld\n", query(1, 0, N - 1, a - 1, b - 1));
        else
            update(a - 1, b);
    }

    return 0;
}