Cod sursa(job #3357560)

Utilizator SimionescuGabrielSimionescu Gabriel SimionescuGabriel Data 11 iunie 2026 13:48:06
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>

#define MAXN 100000

int n, m;
int a[MAXN + 1];
int tree[4 * MAXN + 5];

int max(int x, int y) {
    return (x > y) ? x : y;
}

void build(int node, int st, int dr) {
    if (st == dr) {
        tree[node] = a[st];
        return;
    }

    int mid = (st + dr) / 2;

    build(node * 2, st, mid);
    build(node * 2 + 1, mid + 1, dr);

    tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}

void update(int node, int st, int dr, int pos, int val) {
    if (st == dr) {
        tree[node] = val;
        return;
    }

    int mid = (st + dr) / 2;

    if (pos <= mid)
        update(node * 2, st, mid, pos, val);
    else
        update(node * 2 + 1, mid + 1, dr, pos, val);

    tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}

int query(int node, int st, int dr, int l, int r) {
    if (l <= st && dr <= r)
        return tree[node];

    int mid = (st + dr) / 2;
    int ans = 0;

    if (l <= mid)
        ans = max(ans, query(node * 2, st, mid, l, r));

    if (r > mid)
        ans = max(ans, query(node * 2 + 1, mid + 1, dr, l, r));

    return ans;
}

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

    scanf("%d %d", &n, &m);

    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);

    build(1, 1, n);

    for (int i = 0; i < m; i++) {
        int tip, x, y;
        scanf("%d %d %d", &tip, &x, &y);

        if (tip == 0)
            printf("%d\n", query(1, 1, n, x, y));
        else
            update(1, 1, n, x, y);
    }

    return 0;
}