Cod sursa(job #3140954)

Utilizator PostoacaMateiMatei Postoaca PostoacaMatei Data 11 iulie 2023 11:42:25
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m, a, b, minim, v[400001], citire[400001];

void build(int nod, int st, int dr) {
    if (st == dr)
        v[nod] = citire[st]; // alternativ putem citi direct de aici v[nod]
    else {
        int mij = (st + dr) / 2;
        build(nod * 2, st, mij);
        build(nod * 2 + 1, mij + 1, dr);
        v[nod] = max(v[nod * 2], v[nod * 2 + 1]);
    }
}

void update(int nod, int st, int dr, int poz, int val) {
    if (st == dr)
        v[nod] = val;
    else {
        int mij = (st + dr) / 2;
        if (poz <= mij)
            update(nod * 2, st, mij, poz, val);
        else
            update(nod * 2 + 1, mij + 1, dr, poz, val);
        v[nod] = max(v[nod * 2], v[nod * 2 + 1]);
    }
}

int query(int nod, int st, int dr, int intst, int intdr) {
    if (intst <= st and dr <= intdr)
        return v[nod];
    else {
        int mij = (st + dr) / 2;
        if (intdr <= mij)
            return query(nod * 2, st, mij, intst, intdr);
        if (mij + 1 <= intst)
            return query(nod * 2 + 1, mij + 1, dr, intst, intdr);
        return std::max(query(nod * 2, st, mij, intst, intdr),
            query(nod * 2 + 1, mij + 1, dr, intst, intdr));
    }
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> citire[i];
    build(1, 1, n);
    for (int i = 1; i <= m; i++) {
        int t;
        fin >> t >> a >> b;
        if (t == 0)
            fout << query(1, 1, n, a, b) << "\n";
        else
            update(1, 1, n, a, b);
    }
    return 0;
}