Submission #538073

#TimeUsernameProblemLanguageResultExecution timeMemory
538073fhvirusLong Mansion (JOI17_long_mansion)C++17
100 / 100
279 ms43384 KiB
// jiaqiyang orz
// solution adapted from his/her submission
#include<bits/stdc++.h>
using namespace std;

const int kN = 500005;
int N, Q, C[kN], B[kN];
vector<int> A[kN];

int prv[kN], nxt[kN], occ[kN];
int lb[kN], rb[kN];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> N;
	for (int i = 1; i < N; ++i)
		cin >> C[i];
	for (int i = 1; i <= N; ++i) {
		cin >> B[i];
		A[i].resize(B[i]);
		for (int& a: A[i])
			cin >> a;
	}

	for (int i = 1; i < N; ++i) {
		for (const int& a: A[i])
			occ[a] = i;
		prv[i] = occ[C[i]];
	}
	for (int i = 1; i <= N; ++i)
		occ[i] = N + 1;
	for (int i = N - 1; i >= 1; --i) {
		for (const int& a: A[i + 1])
			occ[a] = i + 1;
		nxt[i] = occ[C[i]];
	}

	for (int i = 1; i <= N; ++i) {
		int l = i, r = i;
		while (true) {
			if (l > 1 and l <= nxt[l - 1] and nxt[l - 1] <= r) {
				r = max(r, rb[l - 1]);
				l = min(l, lb[l - 1]);
			} else if (r < N and l <= prv[r] and prv[r] <= r) {
				++r;
			} else break;
		}
		lb[i] = l; rb[i] = r;
	}

	cin >> Q;
	for (int X, Y, i = 0; i < Q; ++i) {
		cin >> X >> Y;
		cout << (lb[X] <= Y and Y <= rb[X] ? "YES\n" : "NO\n");
	}
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...