Cod sursa(job #3349432)

Utilizator llaris_a23Larisa Alexandra Videnie llaris_a23 Data 29 martie 2026 13:57:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

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

int n, m, op, a, b, p = 0;
int v[100000], arb[400000];

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

    int mij = (st + dr) / 2;

    build(st, mij, act * 2);
    build(mij + 1, dr, act * 2 + 1);

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

void update(int st, int dr, int act, int poz) {
    if (st == dr) {
        arb[act] = v[poz];
        return;
    }

    int mij = (st + dr) / 2;

    if (mij >= poz) {
        update(st, mij, act * 2, poz);
    }
    else {
        update(mij + 1, dr, act * 2 + 1, poz);
    }

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

void query(int st, int dr, int act, int start, int fin) {
    if (st >= start && dr <= fin) {
        p = max(p, arb[act]);
        return;
    }

    int mij = (st + dr) / 2;

    if (mij >= start) {
        query(st, mij, act * 2, start, fin);
    }

    if (mij < fin) {
        query(mij + 1, dr, act * 2 + 1, start, fin);
    }
}

int main() {

    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> v[i];
    }

    build(1, n, 1);

    for (int i = 1; i <= m; i++) {
        fin >> op >> a >> b;

        if (op == 0) {
            p=0;
            query(1, n, 1, a, b);
            fout << p << '\n';
        }
        else {
            v[a] = b;
            update(1, n, 1, a);
        }
    }
}