Untitled

 avatar
unknown
plain_text
2 years ago
967 B
5
Indexable
struct ST {
    vpii t;
    int n;

    ST() {}

    ST(const vi& a) {
        n = a.size();
        t.resize(4 * n);
        build(a);
    }

    pii combine(pii a, pii b) {
        if (a.ff >= b.ff) {
            return a;
        }
        return b;
    }

    void build(const vi& a, int v = 0, int l = 0, int r = -1) {
        if (r == -1) r = n;

        if (r - l == 1) {
            t[v] = {a[l], l};
            return;
        }

        int m = l + (r - l) / 2;
        build(a, 2 * v + 1, l, m);
        build(a, 2 * v + 2, m, r);

        t[v] = combine(t[2 * v + 1], t[2 * v + 2]);
    }

    pii get(int ql, int qr, int v = 0, int l = 0, int r = -1) {
        if (r == -1) r = n;

        if (ql <= l && r <= qr) {
            return t[v];
        }

        if (qr <= l || r <= ql) {
            return {-inf, -1};
        }

        int m = l + (r - l) / 2;
        return combine(get(ql, qr, 2 * v + 1, l, m), get(ql, qr, 2 * v + 2, m, r));
    }
};
Editor is loading...