Cod sursa(job #3358942)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 22 iunie 2026 10:04:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int n, q;
int a[100005], aint[400005];

void Build(int k, int st, int dr) {
    if (st == dr) {
        aint[k] = a[st];
    }
    else {
        int mij = (st + dr) / 2;
        Build(2 * k, st, mij);
        Build(2 * k + 1, mij + 1, dr);
        aint[k] = max(aint[2 * k], aint[2 * k + 1]);
    }
}

void Update(int k, int st, int dr, int poz, int val) {
    if (st == dr) {
        aint[k] = val;
    }
    else {
        int mij = (st + dr) / 2;
        if (poz <= mij) Update(2 * k, st, mij, poz,val);
        else Update(2 * k + 1, mij + 1, dr, poz, val);

        aint[k] = max(aint[2 * k], aint[2 * k + 1]);
    }
}

int Query(int k, int st, int dr, int x, int y) {
    if (x <= st && dr <= y) {
        return aint[k];
    }
    else {
        int mij = (st + dr) / 2;
        if (y <= mij) {
            return Query(2 * k, st, mij, x, y);
        }
        else if (mij < x) {
            return Query(2 * k + 1, mij + 1, dr, x, y);
        }

        return max(Query(2 * k, st, mij, x, y),
                    Query(2 * k + 1, mij + 1, dr, x, y));
    }
}

int main() {
    int tip, x, y;

    fin >> n >> q;
    for (int i = 1; i <= n; i++) {
        fin >> a[i];
    }
    Build(1, 1, n);

    for (int i = 1; i <= q; i++) {
        fin >> tip >> x >> y;
        if (tip == 0) {
            fout << Query(1, 1, n, x, y) << "\n";
        }
        else {
            Update(1, 1, n, x, y);
        }
    }
    return 0;
}