#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |