Cod sursa(job #2585975)

Utilizator copanelTudor Roman copanel Data 19 martie 2020 16:03:47
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <array>
#include <functional>
#include <algorithm>

using std::max;

const int INF = 1 << 30;

constexpr int mylog2(int x) {
    if (x <= 1) {
        return x;
    }
    return 1 + mylog2(x >> 1);
}

template<int len>
class AINT {
    std::array<int, (1<<(mylog2(len) - 2)) + 1> t;

public:
    void update(int n, int poz, int val) {
        std::function<void(int,int,int)> _update = [&](int p, int st, int dr) {
            if (st == dr) {
                t[p] = val;
                return;
            }

            int m = (st + dr) / 2;
            if (poz <= m) {
                _update(2 * p, st, m);
            } else {
                _update(2 * p + 1, m + 1, dr);
            }
            t[p] = std::max(t[2 * p], t[2 * p + 1]);
        };

        _update(1, 1, n);
    }

    int query(int n, int a, int b) {
        std::function<int(int, int, int)> _query = [&](int p, int st, int dr) {
            if (a <= st && b >= dr) {
                return t[p];
            }

            int m = (st + dr) / 2, maxst = -INF, maxdr = -INF;
            if (a <= m) {
                maxst = _query(2 * p, st, m);
            }
            if (b > m) {
                maxdr = _query(2 * p + 1, m + 1, dr);
            }
            return max(maxst, maxdr);
        };

        return _query(1, 1, n);
    }
};

AINT<100000> aint;

int main() {
    std::ifstream fin("arbint.in");
    std::ofstream fout("arbint.out");
    int n, m;

    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int x;
        fin >> x;
        aint.update(n, i, x);
    }

    for (; m > 0; m--) {
        int c, a, b;
        fin >> c >> a >> b;
        if (c == 0) {
            fout << aint.query(n, a, b) << '\n';
        } else {
            aint.update(n, a, b);
        }
    }

    return 0;
}