Submission #95291

#TimeUsernameProblemLanguageResultExecution timeMemory
95291dalgerokLong Mansion (JOI17_long_mansion)C++14
100 / 100
304 ms52432 KiB
#include<bits/stdc++.h> using namespace std; const int N = 5e5 + 5; int n, m, c[N], last[N], le[N], ri[N], st[N], en[N]; vector < int > q[N]; inline bool check_left(int i){ return st[i] > 1 && ri[st[i] - 1] != -1 && ri[st[i] - 1] <= en[i]; } inline bool check_right(int i){ return en[i] < n && le[en[i]] != -1 && st[i] <= le[en[i]]; } int main(){ ios_base::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++){ int x, y; cin >> x; while(x--){ cin >> y; q[i].push_back(y); } } memset(last, -1, sizeof(last)); for(int i = 1; i < n; i++){ for(int j : q[i]){ last[j] = i; } le[i] = last[c[i]]; } memset(last, -1, sizeof(last)); for(int i = n - 1; i >= 1; i--){ for(int j : q[i + 1]){ last[j] = i + 1; } ri[i] = last[c[i]]; } for(int i = 1; i <= n; i++){ st[i] = en[i] = i; while(true){ if(check_left(i)){ en[i] = max(en[i], en[st[i] - 1]); st[i] = min(st[i], st[st[i] - 1]); } else if(check_right(i)){ en[i] += 1; } else{ break; } } } cin >> m; while(m--){ int x, y; cin >> x >> y; cout << (st[x] <= y && y <= en[x] ? "YES\n" : "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...