Submission #1307014

#TimeUsernameProblemLanguageResultExecution timeMemory
1307014Double_SlashLong Mansion (JOI17_long_mansion)C++20
100 / 100
1264 ms113124 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

template <int(*f)(int, int), int I, int n = 500001>
struct St {
    int st[n << 1];

    void init() { fill(st, st + n * 2, I); }

    void upd(int i, int v) {
        for (st[i += n] = v; i >>= 1;) st[i] = f(st[i << 1], st[i << 1 | 1]);
    }

    int operator()(int l, int r) {
        int ret = I;
        for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
            if (l & 1) ret = f(ret, st[l++]);
            if (r & 1) ret = f(ret, st[--r]);
        }
        return ret;
    }
};
St<[] (int a, int b) { return max(a, b); }, 0> mxst;
St<[] (int a, int b) { return min(a, b); }, 500000> mnst;

int main() {
    int n;
    cin >> n;
    int c[n];
    for (int i = 1; i < n; ++i) cin >> c[i];
    int last[n + 1]{}, hi[n + 1]{}, lo[n + 1]{};
    vector<int> a[n + 1], hip[n + 1], lop[n + 2];
    for (int i = 1; i <= n; ++i) {
        int b;
        cin >> b;
        a[i].resize(b);
        for (int &aij: a[i]) {
            cin >> aij;
            last[aij] = i;
        }
        i < n and (hi[i] = last[c[i]]);
        hip[hi[i]].emplace_back(i);
    }
    fill(last, last + n + 1, n + 1);
    fill(lo, lo + n + 1, n + 1);
    for (int i = n; i >= 1; --i) {
        for (int &aij: a[i]) last[aij] = i;
        i > 1 and (lo[i] = last[c[i - 1]]);
        lop[lo[i]].emplace_back(i);
    }
    mxst.init();
    set<int> s;
    for (int i = 0; i <= n; ++i) {
        auto it = s.upper_bound(-lo[i]);
        if (it != s.end() and -*it >= i) mxst.upd(i, -*it);
        for (int j: hip[i]) s.emplace(-j);
    }
    s.clear();
    mnst.init();
    for (int i = n + 1; i >= 1; --i) {
        auto it = s.upper_bound(hi[i]);
        if (it != s.end() and *it <= i) mnst.upd(i, *it);
        for (int j: lop[i]) s.emplace(j);
    }
    int q;
    for (cin >> q; q--;) {
        int x, y;
        cin >> x >> y;
        cout << ((y < x ? mxst(y + 1, x + 1) < x : mnst(x, y) > x) ? "YES\n" : "NO\n");
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...