Cod sursa(job #2859839)

Utilizator CoroloHorjea Cosmin Corolo Data 2 martie 2022 01:05:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

const int NMAX = 100000;

int t[4 * NMAX];

void build(int a[], int v, int tl, int tr) {
    if (tl == tr) {
        t[v] = a[tl];
    } else {
        int tm = (tl + tr) / 2;
        build(a, v * 2, tl, tm);
        build(a, v * 2 + 1, tm + 1, tr);
        t[v] = max(t[v * 2], t[v * 2 + 1]);
    }
}

int maxArb(int v, int tl, int tr, int l, int r) {
    if (l > r)
        return 0;
    if (l == tl && r == tr) {
        return t[v];
    }
    int tm = (tl + tr) / 2;
    return max(maxArb(v * 2, tl, tm, l, min(r, tm)), maxArb(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
}

void update(int v, int tl, int tr, int pos, int new_val) {
    if (tl == tr) {
        t[v] = new_val;
    } else {
        int tm = (tl + tr) / 2;
        if (pos <= tm)
            update(v * 2, tl, tm, pos, new_val);
        else
            update(v * 2 + 1, tm + 1, tr, pos, new_val);
        t[v] = max(t[v * 2], t[v * 2 + 1]);
    }
}

int main() {
    int N, M;
    f >> N >> M;
    int A[N];
    for (int i = 1; i <= N; i++) {
        f >> A[i];
    }
    build(A, 1, 1, N);
    for (int i = 0; i <= 2 * N; i++) {
        cout << t[i] << " ";
    }
    for (int i = 0; i < M; i++) {
        int op, a, b;
        f >> op >> a >> b;
        if (op == 0) {
            g << maxArb(1, 1, N, a, b) << "\n";
        } else {
            update(1, 1, N, a, b);
        }
    }
    f.close();
    g.close();
}
// 4 3 5 6 1

//     6 [1,5]
//   5    6
// 4  5  6 1
// 4 3