Cod sursa(job #1252101)

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

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

static int H[NMAX], N;

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

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

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

static int query(int nod, int st, int dr, int a, int b)
{
    int 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)
{
    int n, m, i, op, a, b;

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

    scanf("%d %d", &n, &m);
    N = pow(2, (int) 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("%d %d %d", &op, &a, &b);
        if (op == 0)
            printf("%d\n", query(1, 0, N - 1, a - 1, b - 1));
        else
            update(a - 1, b);
    }

    return 0;
}