fork download
  1. //#pragma GCC optimize("Ofast,unroll-loops")
  2. //#pragma GCC target("avx2,tune=native")
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. #define file "o"
  7. #define ff(i,a,b) for(auto i=(a); i<=(b); ++i)
  8. #define ffr(i,b,a) for(auto i=(b); i>=(a); --i)
  9. #define nl "\n"
  10. #define ss " "
  11. #define pb emplace_back
  12. #define fi first
  13. #define se second
  14. #define sz(s) (int)(s).size()
  15. #define all(s) (s).begin(), (s).end()
  16. #define ms(a,x) memset(a,x,sizeof(a))
  17. #define cn continue
  18. #define re exit(0)
  19.  
  20. typedef long long ll;
  21. typedef vector<int> vi;
  22.  
  23. inline void rf(){
  24. ios::sync_with_stdio(false);
  25. cin.tie(nullptr); cout.tie(nullptr);
  26. if(fopen(file".inp","r")){
  27. freopen(file".inp","r",stdin);
  28. freopen(file".out","w",stdout);
  29. }
  30. }
  31.  
  32. struct BIT {
  33. int n; vi f;
  34. BIT(){} BIT(int n):n(n),f(n+1,0){}
  35. inline void add(int i,int v){ for(; i<=n; i+=i&-i) f[i]+=v; }
  36. inline int sum(int i){ int r=0; for(; i>0; i-=i&-i) r+=f[i]; return r; }
  37. };
  38.  
  39. struct MST {
  40. int n; vector<vi> t;
  41. MST(){}
  42. MST(const vector<int>& a){ build(a); }
  43. void build(const vector<int>& a){
  44. int m = (int)a.size();
  45. n = 1; while(n < m) n <<= 1;
  46. t.assign(2*n, {});
  47. for(int i=0;i<m;i++) t[n+i] = {a[i]};
  48. for(int i=n-1;i>=1;i--){
  49. auto &L=t[i<<1], &R=t[i<<1|1];
  50. t[i].resize(sz(L)+sz(R));
  51. merge(all(L), all(R), t[i].begin());
  52. }
  53. }
  54. void collect(int l,int r, vector<int>& nodes){
  55. l+=n; r+=n;
  56. vector<int> left, right;
  57. while(l<=r){
  58. if(l&1){ left.pb(l); l++; }
  59. if(!(r&1)){ right.pb(r); r--; }
  60. l>>=1; r>>=1;
  61. }
  62. reverse(all(right));
  63. nodes.clear();
  64. nodes.reserve(sz(left)+sz(right));
  65. for(int id:left) nodes.pb(id);
  66. for(int id:right) nodes.pb(id);
  67. }
  68. };
  69.  
  70. int main(){
  71. rf();
  72. int n; if(!(cin>>n)) return 0;
  73.  
  74. vector<vi> g1(n), g2(n);
  75. ff(i,0,n-1){
  76. int d; cin>>d; g1[i].reserve(d);
  77. ff(j,1,d){int x;cin>>x; g1[i].pb(x);}
  78. }
  79. ff(i,0,n-1){
  80. int d; cin>>d; g2[i].reserve(d);
  81. ff(j,1,d){int x;cin>>x; g2[i].pb(x);}
  82. }
  83.  
  84. auto dfs = [&](const vector<vi>& g){
  85. vi tin(n), tout(n), it(n,0); vector<char> vis(n,0);
  86. vector<int> st; st.pb(0); int T=0;
  87. while(!st.empty()){
  88. int v=st.back();
  89. if(!vis[v]){vis[v]=1; tin[v]=T++;}
  90. if(it[v]<(int)g[v].size()){int u=g[v][it[v]++]; st.pb(u);}
  91. else{tout[v]=T; st.pop_back();}
  92. }
  93. return pair<vi,vi>(tin,tout);
  94. };
  95.  
  96. auto p1=dfs(g1), p2=dfs(g2);
  97. vi tin1=p1.fi, tout1=p1.se, tin2=p2.fi, tout2=p2.se;
  98.  
  99. vi ordX(n); ff(v,0,n-1) ordX[tin1[v]]=v;
  100. vi posX(n); ff(i,0,n-1) posX[ordX[i]]=i;
  101.  
  102. vi y2node(n); ff(v,0,n-1) y2node[tin2[v]]=v;
  103. vector<int> P(n);
  104. ff(y,0,n-1){int v=y2node[y]; P[y]=posX[v];} // x in [0..n-1]
  105.  
  106. MST mst(P);
  107. BIT bit(n+2);
  108.  
  109. int q; cin>>q;
  110. vector<string> ans(q);
  111. vector<int> nodes; nodes.reserve(64);
  112. vector<int> used; used.reserve(n);
  113.  
  114. ff(i,0,q-1){
  115. int u,v; cin>>u>>v;
  116. int Lx=tin1[u], Rx=tout1[u]-1; // x-range inclusive
  117. int Ly=tin2[v], Ry=tout2[v]-1; // y-range inclusive
  118. if(Lx>Rx || Ly>Ry){ ans[i]="YES"; cn; }
  119.  
  120. mst.collect(Ly,Ry,nodes);
  121. ll inv=0; int inserted=0;
  122. used.clear();
  123.  
  124. for(int id: nodes){
  125. const auto &vec = mst.t[id];
  126. auto itL = lower_bound(all(vec), Lx);
  127. auto itR = upper_bound(all(vec), Rx);
  128. for(auto it=itL; it!=itR; ++it){
  129. int x = *it + 1; // BIT is 1-based
  130. inv += inserted - bit.sum(x);
  131. bit.add(x,1);
  132. used.pb(x);
  133. ++inserted;
  134. }
  135. }
  136.  
  137. for(int x: used) bit.add(x,-1);
  138. ans[i] = (inv==0 ? "YES" : "NO");
  139. }
  140.  
  141. ff(i,0,q-1) cout<<ans[i]<<nl;
  142. re;
  143. }
  144.  
Success #stdin #stdout 0s 5328KB
stdin
7
3 2 3 6
0
0
2 4 1
0
0
1 5
1 5
0
0
0
3 6 1 2
2 3 4
0
4
3 5
0 4
3 3
6 5
stdout
YES
NO
YES
NO