Cod sursa(job #3358791)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 20 iunie 2026 15:21:42
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <iostream>
using namespace std;

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

int n, m;;
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 (y < st || dr < x) return -1;
    if (x <= st && dr <= y) return aint[k];
    int mij = (st + dr) / 2;
    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 >> m;
    for (int i = 1; i <= n; i++) {
        fin >> a[i];
    }
    Build(1, 1, n);
    for (int i = 1; i <= n; i++) {
        fin >> tip >> x >> y;
        if (tip == 0) {
            fout << Query(1, 1, n, x, y) << "\n";
        }
        else {
            Update(1, 1, n, x, y);
        }
    }
}