Cod sursa(job #2030302)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 1 octombrie 2017 13:53:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

#define MAXN 100000

int aint[2 * MAXN];

int main() {
    int n, q;
    fin >> n >> q;

    for (int i = 0; i < n; i++)
        fin >> aint[i + n];

    for (int i = n - 1; i; i--)
        aint[i] = std::max(aint[2 * i], aint[2 * i + 1]);

    for (; q; q--) {
        int t;
        fin >> t;
        if (t == 0) {
            int left, right, ans = 0;
            fin >> left >> right;
            left += n - 1;
            right += n - 1;
            while (left <= right) {
                ans = std::max(ans, std::max(aint[left], aint[right]));
                left = (left + 1) / 2;
                right = (right - 1) / 2;
            }
            fout << ans << '\n';
        } else {
            int poz;
            fin >> poz;
            poz += n - 1;
            fin >> aint[poz];
            while (poz > 1) {
                aint[poz / 2] = std::max(aint[poz], aint[poz ^ 1]);
                poz /= 2;
            }
        }
    }

    return 0;
}