이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 500008;
int n, q, c[N], sz[N], L[N], R[N], cl[N], cr[N];
bool proc[N];
vector<int> key[N];
void dnc(int l, int r) {
if (l > r) return;
int mid = (l + r) / 2;
if (proc[mid]) return;
while (true) {
if (L[mid] != 1 && cr[L[mid] - 1] <= R[mid]) {
L[mid]--;
if (proc[L[mid]]) {
L[mid] = min(L[L[mid]], L[mid]);
R[mid] = max(R[L[mid]], R[mid]);
}
} else if (R[mid] != n && cl[R[mid]] >= L[mid]) {
R[mid]++;
if (proc[R[mid]]) {
L[mid] = min(L[R[mid]], L[mid]);
R[mid] = max(R[R[mid]], R[mid]);
}
} else break;
}
proc[mid] = true;
dnc(l, mid);
dnc(mid + 1, r);
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 1; i < n; i++) cin >> c[i];
for (int i = 1; i <= n; i++) {
cin >> sz[i];
L[i] = R[i] = i;
for (int j = 0, x; j < sz[i]; j++) {
cin >> x;
key[x].push_back(i);
}
}
for (int i = 1; i <= n - 1; i++) {
auto it = upper_bound(key[c[i]].begin(), key[c[i]].end(), i);
if (it == key[c[i]].begin()) cl[i] = -1;
else cl[i] = *(--it);
it = lower_bound(key[c[i]].begin(), key[c[i]].end(), i + 1);
if (it == key[c[i]].end()) cr[i] = n + 1;
else cr[i] = *it;
}
dnc(1, n);
// for (int i = 1; i <= n; i++) cout << L[i] << ' ' << R[i] << '\n';
cin >> q;
while (q--) {
int x, y;
cin >> x >> y;
if (L[x] <= y && y <= R[x]) cout << "YES\n";
else cout << "NO\n";
}
}
# | 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... |