Cod sursa(job #2174918)

Utilizator RaduVFVintila Radu-Florian RaduVF Data 16 martie 2018 14:13:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int  nmax = 100005;
int n, m, arb[4*nmax+5], maxim;
void Actualizare(int st, int dr, int poz, int val, int nod) {
    if (st == dr) {
        arb[nod] = val;
        return;
    }
    int m = (st + dr) / 2;
    if (poz <= m)
        Actualizare(st, m, poz, val, 2 * nod);
    else
        Actualizare(m + 1, dr, poz, val, 2 * nod + 1);
    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
void GasesteMaxim(int st, int dr, int a, int b, int nod) {
    if (st >= a && dr <= b) {
        if (arb[nod] > maxim)
            maxim = arb[nod];
        return;
    }
    int m = (st + dr) / 2;
    if (m >= a)
        GasesteMaxim(st, m, a, b, 2 * nod);
    if (m < b)
        GasesteMaxim(m + 1, dr, a, b, 2 * nod + 1);
}
int main() {
    int i, x, a, b;
    fin >> n >> m;
    for (i = 1; i <= n; i++) {
        fin >> x;
        Actualizare(1, n, i, x, 1);
    }
    for (i = 1; i <= m; i++) {
        fin >> x >> a >> b;
        if (x == 1)
            Actualizare(1, n, a, b, 1);
        else {
            maxim = -1;
            GasesteMaxim(1, n, a, b, 1);
            fout << maxim << '\n';
        }
    }
    fout.close();
    return 0;
}