Cod sursa(job #2466237)

Utilizator FnZbZVrinceanu Radu FnZbZ Data 1 octombrie 2019 19:27:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int n, m, arb[4*100001+66], Pos, Val, start, finish, maxim;

void Query(int node, int left, int right) {
    if (start <= left && right <= finish) {
        if (maxim < arb[node]) maxim = arb[node];
        return;
    }

    int half = (left + right) / 2;
    if (start <= half) Query(2 * node, left, half);
    if (half < finish) Query(2 * node + 1, half + 1, right);
}

void Update(int node, int left, int right) {
    if(left == right) {
        arb[node] = Val;
        return;
    }

    int half = (left + right) / 2;
    if (Pos <= half) Update(2 * node, left, half);
    else Update(2 * node + 1, half + 1, right);

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

void init() {
    int X, A, B;

    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> X;
        Pos = i, Val = X;
        Update(1, 1, n);
    }

    for (int i = 1; i <= m; i++) {
        cin >> X >> A >> B;
        if (!X) {
            maxim = 0;
            start = A, finish = B;
            Query(1, 1, n);

            cout << maxim << '\n';
        } else {
            Pos = A, Val = B;
            Update(1, 1, n);
        }
    }
}

int main() {
    init();

    cin.close();
    cout.close();
    return 0;
}