Cod sursa(job #2381958)

Utilizator AndoneAlexandruAndone Alexandru AndoneAlexandru Data 17 martie 2019 14:54:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#define NMAX 100005
using namespace std;

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

int n, m;
int arr[NMAX], arb[4*NMAX];

void build(int st, int dr, int trPoz) {
    if (st == dr) {
        arb[trPoz] = arr[st];
        return;
    }

    int mij = (st + dr) / 2;
    build(st, mij, 2*trPoz);
    build(mij+1, dr, 2*trPoz+1);

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

void update(int st, int dr, int trPoz, int finPoz, int val) {
    if (st == dr) {
        arb[trPoz] = val;
        return;
    }

    int mij = (st + dr) / 2;
    if (mij >= finPoz) update(st, mij, 2*trPoz, finPoz, val);
    else update(mij+1, dr, 2*trPoz+1, finPoz, val);

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

int interv(int st, int dr, int trPoz, int a, int b) {
    if (st >= a && dr <= b)
        return arb[trPoz];
    if (dr < a || st > b)
        return -1;

    int mij = (st + dr) / 2;
    return max(interv(st, mij, 2*trPoz, a, b), interv(mij+1, dr, 2*trPoz+1, a, b));
}

int main() {
    in >> n >> m;
    for (int i = 1; i <= n; ++i)
        in >> arr[i];

    build(1, n, 1);
    while (m) {
        int p, a, b;
        in >> p >> a >> b;
        if (p == 0) out << interv(1, n, 1, a, b) << '\n';
        else update(1, n, 1, a, b);
        m--;
    }
    return 0;
}