Cod sursa(job #3358886)

Utilizator fmi-studentnu sunt de acord fmi-student Data 21 iunie 2026 14:34:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 100000;

int arr[N + 1];
int segment_tree[N * 4];

void build(int node, int left, int right) {
    if (left == right) {
        segment_tree[node] = arr[left];
    } else {
        int interval_middle = (left + right) / 2;

        build(2 * node, left, interval_middle);
        build(2 * node + 1, interval_middle + 1, right);

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

void update(int node, int left, int right, int position, int value) {
    if (left == right) {
        segment_tree[node] = value;
    } else {
        int interval_middle = (left + right) / 2;

        if (position <= interval_middle) {
            update(2 * node, left, interval_middle, position, value);
        } else {
            update(2 * node + 1, interval_middle + 1, right, position, value);
        }

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

int query(int node, int left, int right, int query_left, int query_right) {
    if (left >= query_left && right <= query_right) {
        return segment_tree[node];
    }

    int middle = (left + right) / 2;
    if (query_right <= middle) {
        return query(2 * node, left, middle, query_left, query_right);
    }

    if (query_left >= middle+1) {
        return query(2 * node + 1, middle + 1, right, query_left, query_right);
    }

    return max(query(2 * node, left, middle, query_left, query_right), query(2 * node + 1, middle + 1, right, query_left, query_right));
}

int main() {
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ifstream fin("arbint.in");
    int n, q;
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        fin >> arr[i];

    build(1, 1, n);

    int a, b, c;
    ofstream fout("arbint.out");
    while (q--) {
        fin >> a >> b >> c;
        if (a == 0) {
            fout << query(1, 1, n, b, c) << '\n';
        } else {
            update(1, 1, n, b, c);
        }
    }

    return 0;
}