Cod sursa(job #2753292)

Utilizator truscalucaLuca Trusca truscaluca Data 22 mai 2021 11:53:15
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <climits>

using namespace std;

const int nMax = 100005;

int x, v[nMax], c, val, indexVal, intervalSt, intervalDr;

void actualizeaza(int pozNod, int indexSt, int indexDr) {
    if (indexSt == indexDr) {
        v[pozNod] = val;
        return;
    }

    int mijIndex = (indexSt + indexDr) / 2;
    if (indexVal <= mijIndex) {
        actualizeaza(2 * pozNod, indexSt, mijIndex);
    } else {
        actualizeaza(2 * pozNod + 1, mijIndex + 1, indexDr);
    }

    v[pozNod] = max(v[2 * pozNod], v[2 * pozNod + 1]);
}

int interogheaza(int pozNod, int indexSt, int indexDr) {
    if (intervalSt <= indexSt && indexDr <= intervalDr) {
        return v[pozNod];
    }

    int mijIndex = (indexSt + indexDr) / 2;
    int maxSt = INT_MIN, maxDr = INT_MIN;
    if (intervalSt <= mijIndex) {
        maxSt = interogheaza(2 * pozNod, indexSt, mijIndex);
    }
    if (intervalDr > mijIndex) {
        maxDr = interogheaza(2 * pozNod, mijIndex + 1, indexDr);
    }

    return max(maxSt, maxDr);
}

int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int n, m;
    cin >> n >> m;

    for (indexVal = 1; indexVal <= n; indexVal++) {
        cin >> val;
        actualizeaza(1, 1, n);
    }

    for (int i = 0; i < m; i++) {
        cin >> c;
        if (c == 0) {
            cin >> intervalSt >> intervalDr;
            cout << interogheaza(1, 1, n) << "\n";
        } else if (c == 1) {
            cin >> indexVal >> val;
            actualizeaza(1, 1, n);
        }
    }

    return 0;
}