Cod sursa(job #3357315)

Utilizator bogdanogrinOGRIN BOGDAN bogdanogrin Data 8 iunie 2026 18:56:33
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <stdio.h>

int a[100005];
int tree[400020];

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

void build(int node, int left, int right) {
    if (left == right) {
        tree[node] = a[left];
        return;
    }
    int mid = left + (right - left) / 2;
    build(2 * node, left, mid);
    build(2 * node + 1, mid + 1, right);
    tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}

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

int query(int node, int left, int right, int q_left, int q_right) {
    if (q_left <= left && right <= q_right) {
        return tree[node];
    }
    int mid = left + (right - left) / 2;
    int res_left = -1, res_right = -1;
    
    if (q_left <= mid) {
        res_left = query(2 * node, left, mid, q_left, q_right);
    }
    if (q_right > mid) {
        res_right = query(2 * node + 1, mid + 1, right, q_left, q_right);
    }
    return max(res_left, res_right);
}

int main() {
    FILE *fin = fopen("arbint.in", "r");
    FILE *fout = fopen("arbint.out", "w");
    
    int n, m;
    if (fscanf(fin, "%d %d", &n, &m) == 2) {
        for (int i = 1; i <= n; i++) {
            fscanf(fin, "%d", &a[i]);
        }
        
        build(1, 1, n);
        
        for (int i = 0; i < m; i++) {
            int type, x, y;
            if (fscanf(fin, "%d %d %d", &type, &x, &y) == 3) {
                if (type == 0) {
                    fprintf(fout, "%d\n", query(1, 1, n, x, y));
                } else if (type == 1) {
                    update(1, 1, n, x, y);
                }
            }
        }
    }
    
    fclose(fin);
    fclose(fout);
    return 0;
}