Submission #717106

#TimeUsernameProblemLanguageResultExecution timeMemory
717106ymmLong Mansion (JOI17_long_mansion)C++17
100 / 100
305 ms56476 KiB
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

const int N = 500'010;

namespace seg {
	int t[4*N];
	int n;

	void build(int *a, int i, int b, int e) {
		if (e-b == 1) {
			t[i] = a[b];
			return;
		}
		build(a, 2*i+1, b, (b+e)/2);
		build(a, 2*i+2, (b+e)/2, e);
		t[i] = min(t[2*i+1], t[2*i+2]);
	}
	void build(int *a, int len) {
		n = len;
		build(a, 0, 0, n);
	}

	int get(int l, int r, int x, int i, int b, int e) {
		if (r <= b || e <= l || t[i] >= x)
			return r;
		if (e-b == 1)
			return b;
		int ans = r;
		ans = get(l, r, x, 2*i+1, b, (b+e)/2);
		if (ans != r)
			return ans;
		ans = get(l, r, x, 2*i+2, (b+e)/2, e);
		if (ans != r)
			return ans;
		return r;
	}
	int get(int l, int r, int x) {
		if (l == r)
			return r;
		return get(l, r, x, 0, 0, n);
	}
}

int col[N], lst[N];
int left_key[N], right_key[N];
int L[N], R[N];
vector<int> keys[N];
int n;

int main()
{
	cin.tie(0) -> sync_with_stdio(false);
	cin >> n;
	Loop (i,0,n-1) {
		cin >> col[i];
		--col[i];
	}
	Loop (i,0,n) {
		int k;
		cin >> k;
		while (k--) {
			int x;
			cin >> x;
			keys[i].push_back(x-1);
		}
	}

	fill(lst, lst+n, -1);
	Loop (i,0,n-1) {
		for (int k : keys[i])
			lst[k] = i;
		left_key[i] = lst[col[i]];
	}
	fill(lst, lst+n, n);
	LoopR (i,1,n) {
		for (int k : keys[i])
			lst[k] = i;
		right_key[i-1] = lst[col[i-1]];
	}
	seg::build(left_key, n-1);

	Loop (i,0,n) {
		L[i] = R[i] = i;
		for (;;) {
			int j = seg::get(R[i], n-1, L[i]);
			R[i] = j;
			if (L[i] == 0 || right_key[L[i]-1] > R[i])
				break;
			R[i] = max(R[i], R[L[i]-1]);
			L[i] = min(L[i], L[L[i]-1]);
		}
	}

	int q;
	cin >> q;
	while (q--) {
		int x, y;
		cin >> x >> y;
		--x; --y;
		cout << (L[x] <= y && y <= R[x]? "YES": "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...