Submission #1182173

#TimeUsernameProblemLanguageResultExecution timeMemory
1182173skibidisigmabartuss69Long Mansion (JOI17_long_mansion)C++20
0 / 100
82 ms9916 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll int64_t
#define vi vector<int>
#define vvi vector<vi>
#define iter const auto&

void Solve() {
    int n;
    cin >> n;

    vi door_key(n + 1); // 1-based door indices
    for (int i = 1; i < n; ++i)
        cin >> door_key[i];

    vvi sector_keys(n + 1); // 1-based sectors
    for (int i = 1; i <= n; ++i) {
        int k;
        cin >> k;
        sector_keys[i].resize(k);
        for (int& key : sector_keys[i])
            cin >> key;
    }

    vi left_bound(n + 1), right_bound(n + 1);

    { // Compute left_bound
        vi last_key(n + 2, 0);
        for (int i = 1; i <= n; ++i) {
            for (int key : sector_keys[i])
                last_key[key] = i;
            if (i < n)
                left_bound[i] = last_key[door_key[i]];
        }
    }

    { // Compute right_bound
        vi last_key(n + 2, n + 1);
        for (int i = n; i >= 1; --i) {
            for (int key : sector_keys[i])
                last_key[key] = i;
            if (i > 1)
                right_bound[i - 1] = last_key[door_key[i - 1]];
        }
    }

    vi left_reach(n + 1), right_reach(n + 1);
    for (int i = 1; i <= n; ++i) {
        left_reach[i] = right_reach[i] = i;
        while (true) {
            bool expanded = false;

            if (left_reach[i] > 1) {
                int door = left_reach[i] - 1;
                if (right_bound[door] <= right_reach[i]) {
                    left_reach[i] = min(left_reach[i], left_reach[door]);
                    right_reach[i] = max(right_reach[i], right_reach[door]);
                    expanded = true;
                }
            }

            if (right_reach[i] < n && left_reach[i] <= left_bound[right_reach[i]]) {
                ++right_reach[i];
                expanded = true;
            }

            if (!expanded) break;
        }
    }

    int q; cin >> q;
    while (q--) {
        int s, t; cin >> s >> t;
        cout << (left_reach[s] <= t && t <= right_reach[s] ? "TAK\n" : "NIE\n");
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    Solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...