Cod sursa(job #2606143)

Utilizator KPP17Popescu Paul KPP17 Data 27 aprilie 2020 07:49:35
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#define fisier "arbint"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");



const int
N = 100000,
M = N,
LOG2N = 18;

int n, m, v[LOG2N][N], pow2[LOG2N];

#include <algorithm>

int main()
{
    in >> n >> m;

    for (int i = 0; i < n; i++)
        in >> (*v)[i];

    for (int exp = 0; (1 << (exp+1)) <= n; exp++)
        for (int i = 0; i < n; i++)
            v[exp+1][i] = std::max(v[exp][i], v[exp][i + (1 << exp)]);

    for (int i = 0; i < LOG2N; i++)
        pow2[i] = 1 << i;

    while (m--)
    {
        bool q; in >> q;
        int a, b; in >> a >> b; a--;

        if (q)
        {
            (*v)[a] = b;
            for (int exp = 1; (1 << exp) <= n; exp++)
                for (int i = 1 << exp; i--;)
                    v[exp][a - i] = std::max(v[exp-1][a - i], v[exp-1][a - i + (1 << (exp-1))]);
        }
        else
        {
            int
            lun = b - a,
            exp = std::upper_bound(pow2, pow2 + LOG2N, lun) - 1 - pow2;

            out << std::max(v[exp][a], v[exp][b - (1 << exp)]) << '\n';
        }
    }
}