Cod sursa(job #3299842)

Utilizator Tuduce_RobertTuduce Robert Florin Tuduce_Robert Data 10 iunie 2025 21:17:24
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 100005

long long A[MAXN];
long long tree[4 * MAXN];
long long N, M;

void build(long long node, long long l, long long r) {
    if (l == r) {
        tree[node] = A[l];
    } else {
        long long mid = (l + r) / 2;
        build(2 * node, l, mid);
        build(2 * node + 1, mid + 1, r);
        tree[node] = (tree[2 * node] > tree[2 * node + 1]) ? tree[2 * node] : tree[2 * node + 1];
    }
}

long long query(long long node, long long l, long long r, long long ql, long long qr) {
    if (qr < l || ql > r) return -1LL;
    if (ql <= l && r <= qr) return tree[node];

    long long mid = (l + r) / 2;
    long long st = query(2 * node, l, mid, ql, qr);
    long long dr = query(2 * node + 1, mid + 1, r, ql, qr);
    return (st > dr) ? st : dr;
}

void update(long long node, long long l, long long r, long long pos, long long val) {
    if (l == r) {
        tree[node] = val;
    } else {
        long long mid = (l + r) / 2;
        if (pos <= mid)
            update(2 * node, l, mid, pos, val);
        else
            update(2 * node + 1, mid + 1, r, pos, val);
        tree[node] = (tree[2 * node] > tree[2 * node + 1]) ? tree[2 * node] : tree[2 * node + 1];
    }
}

int main() {
    FILE *fin = fopen("arbint.in", "r");
    FILE *fout = fopen("arbint.out", "w");

    fscanf(fin, "%lld %lld", &N, &M);

    for (long long i = 0; i < N; i++) {
        fscanf(fin, "%lld", &A[i]);
    }

    build(1, 0, N - 1);

    for (long long i = 0; i < M; i++) {
        long long op, a, b;
        fscanf(fin, "%lld %lld %lld", &op, &a, &b);
        a--;

        if (op == 0) {
            b--;
            long long res = query(1, 0, N - 1, a, b);
            fprintf(fout, "%lld\n", res);
        } else {
            update(1, 0, N - 1, a, b);
        }
    }

    fclose(fin);
    fclose(fout);
    return 0;
}