Cod sursa(job #1252314)

Utilizator js3292618Andrei Mihai js3292618 Data 30 octombrie 2014 17:26:31
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>

#define max(a, b) ((a > b) ? a : b)

static int H[235000], N = 2;

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

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

static int query(int nod, int st, int dr, int a, int b)
{
    int mid, s = 0, d = 0;

    if (a <= st && dr <= b)
        return H[nod];

    mid = st + ((dr - st) >> 1);
    nod <<= 1;
    if (a <= mid)
        s = query(nod, st, mid, a, b);
    if (b > mid)
        d = query(nod + 1, mid + 1, dr, a, b);
    return max(s, d);
}

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

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

    scanf("%d %d", &n, &m);
    a = n;
    while (a >>= 1)
        N <<= 1;

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

    while (m--) {
        scanf("%d %d %d", &op, &a, &b);
        if (op)
            update(a - 1, b);
        else
            printf("%d\n", query(1, 0, N - 1, a - 1, b - 1));
    }

    return 0;
}