Cod sursa(job #2855782)

Utilizator megulolMegu Lol megulol Data 22 februarie 2022 21:58:23
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <stdlib.h>

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

void update(int *arr, int node, int left, int right, int pos, int val) {
    if(left == right) {
        arr[node] = val;
        return;
    }
    int div = left + (right - left) / 2;
    if (pos <= div) update (arr, 2 * node, left, div, pos, val);
    else update (arr, 2 * node + 1, div + 1, right, pos, val);
    arr[node] = maxim(arr[2 * node], arr[2 * node + 1]);
}

void query(int *arr, int node, int left, int right, int start, int finish, int *max) {
    if(start <= left && right <= finish) {
        if(*max < arr[node]) *max = arr[node];
        return;
    }
    int div = left + (right - left) / 2;
    if (start <= div) query(arr, 2 * node, left, div, start, finish, max);
    if (div < finish) query(arr, 2 * node + 1, div + 1, right, start, finish, max);
}

int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n, m;
    scanf("%d %d", &n, &m);
    int *arr = malloc(sizeof(int) * (4 * n + 66));
    for(int i = 1; i <= n; i++) {
        int x;
        scanf("%d", &x);
        update(arr, 1, 1, n, i, x);
    }
    for(int i = 1; i <= m; i++) {
        int x, a, b;
        scanf("%d %d %d", &x, &a, &b);
        if(x == 0) {
            int max = -1;
            query(arr, 1, 1, n, a, b, &max);
            printf("%d\n", max);
        } else {
            update(arr, 1, 1, n, a, b);
        }
    }
    printf("\n");
    free(arr);
}