Submission #1326394

#TimeUsernameProblemLanguageResultExecution timeMemory
1326394LmaoLmaoLong Mansion (JOI17_long_mansion)C++20
100 / 100
597 ms167256 KiB
#include <bits/stdc++.h> //#define int long long #define name "a" #define fi first #define se second using namespace std; using ll = long long; using ii = pair<int,int>; using aa = array<int,3>; const int N = 5e5+5; const int MOD = 1e9+7; int c[N]; vector<int> key[N]; int L[N],R[N]; int rmq[4][N][20]; int get(int t,int l,int r) { int x=__lg(r-l+1); if(t%2==0) { return min(rmq[t][l][x],rmq[t][r-(1<<x)+1][x]); } else { return max(rmq[t][l][x],rmq[t][r-(1<<x)+1][x]); } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n; cin >> n; for(int i=1;i<n;i++) { cin >> c[i]; } for(int i=1;i<=n;i++) { int k; cin >> k; while(k--) { int x; cin >> x; key[x].push_back(i); } } for(int i=1;i<=n;i++) { sort(key[i].begin(),key[i].end()); } for(int i=2;i<=n;i++) { if(key[c[i-1]].size()==0) { L[i]=0; continue; } L[i]=lower_bound(key[c[i-1]].begin(),key[c[i-1]].end(),i)-key[c[i-1]].begin(); if(L[i]!=0) { L[i]=key[c[i-1]][L[i]-1]; } } for(int i=1;i<n;i++) { R[i]=upper_bound(key[c[i]].begin(),key[c[i]].end(),i)-key[c[i]].begin(); if(R[i]!=key[c[i]].size()) { R[i]=key[c[i]][R[i]]; } else { R[i]=n+1; } } R[0]=n+1; L[n+1]=0; L[1]=0; R[n]=n+1; for(int i=1;i<=n;i++) { //cout << L[i] << ' ' << R[i] << endl; rmq[0][i][0]=L[i]; rmq[1][i][0]=R[i]; } for(int j=1;j<=__lg(n);j++) { for(int i=1;i+(1 << j)-1<=n;i++) { rmq[0][i][j]=min(rmq[0][i][j-1],rmq[0][i+(1<< j-1)][j-1]); rmq[1][i][j]=max(rmq[1][i][j-1],rmq[1][i+(1<< j-1)][j-1]); } } for(int i=1;i<=n;i++) { if(L[i]==0) { rmq[2][i][0]=0; continue; } int l=L[i],r=i-1; while(l<=r) { int mid = l+r >> 1; if(get(1,L[i],mid)>=i) { rmq[2][i][0]=mid+1; r=mid-1; } else { l=mid+1; } } } for(int i=1;i<=n;i++) { if(R[i]>n) { rmq[3][i][0]=n+1; continue; } int l=i+1,r=R[i]; while(l<=r) { int mid = l+r >> 1; if(get(0,mid,R[i])<=i) { rmq[3][i][0]=mid-1; l=mid+1; } else { r=mid-1; } } } for(int j=1;j<=__lg(n);j++) { for(int i=1;i+(1 << j)-1<=n;i++) { rmq[2][i][j]=min(rmq[2][i][j-1],rmq[2][i+(1<< j-1)][j-1]); rmq[3][i][j]=max(rmq[3][i][j-1],rmq[3][i+(1<< j-1)][j-1]); } } int q; cin >> q; while(q--) { int x,y; cin >> x >> y; if(x<y) { if(get(2,x+1,y)<=x) { cout << "NO\n"; } else { cout << "YES\n"; } } else { if(get(3,y,x-1)>=x) { cout << "NO\n"; } else { cout << "YES\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...