Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define eb emplace_back
  4. #define pb push_back
  5. #define ppb pop_back
  6. #define endl '\n'
  7. #define mii map<ll,ll>
  8. #define msi map<string,ll>
  9. #define mis map<ll, string>
  10. #define rep(i,a,b) for(ll i=a;i<b;i++)
  11. #define mpi map<pair<ll,ll>,ll>
  12. #define pii pair<ll,ll>
  13. #define vi vector<ll>
  14. #define vpi vector<pair<ll, ll>>
  15. #define vs vector<string>
  16. #define all(a) (a).begin(),(a).end()
  17. #define rall(a) (a).rbegin(),(a).rend()
  18. #define F first
  19. #define S second
  20. #define sz(x) (ll)x.size()
  21. #define hell 1000000007
  22. #define lbnd lower_bound
  23. #define ubnd upper_bound
  24. #define bs binary_search
  25. #define mp make_pair
  26. #define what_is(x) cerr << #x << " is " << x << endl;
  27. #define time cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
  28. using namespace std;
  29. #define N 100005
  30.  
  31. ll max(ll n, ll m)
  32. {
  33. if(n >= m)
  34. return n;
  35. else
  36. return m;
  37. }
  38. ll min(ll n, ll m)
  39. {
  40. if(n <= m)
  41. return n;
  42. else
  43. return m;
  44. }
  45. void digest(vi &v, ll n)
  46. {
  47. ll elem;
  48. rep(i,0,n)
  49. {
  50. cin>>elem;
  51. v.eb(elem);
  52. }
  53. }
  54. void vomit(vi &v, ll a, ll b)
  55. {
  56. rep(i,a,b)
  57. cout<<v.at(i)<<" ";
  58. cout<<"\n";
  59. }
  60.  
  61.  
  62.  
  63. vi v[N];
  64. vi visited(N,-1);
  65. vi level(N,-1);
  66. ll timer = 0;
  67. vi intime(N+100);
  68. vi outtime(N+100);
  69. void bfs(ll src)
  70. {
  71. level.at(src) = 0;
  72. queue <ll> q;
  73. q.emplace(src);
  74.  
  75. visited.at(src) = 1;
  76.  
  77. ll elem;
  78. while(!q.empty())
  79. {
  80. elem = q.front();
  81. q.pop();
  82.  
  83. rep(i,0,v[elem].size())
  84. {
  85. if(visited.at(v[elem].at(i)) == -1)
  86. {
  87. q.emplace(v[elem].at(i));
  88. visited.at(v[elem].at(i)) = 1;
  89. level.at(v[elem].at(i)) = level.at(elem)+1;
  90. }
  91. }
  92. }
  93. }
  94. void dfs(ll node)
  95. {
  96. visited.at(node) = 1;
  97. ++timer;
  98.  
  99. intime.at(node) = timer;
  100. rep(i,0,v[node].size())
  101. {
  102. if(visited.at(v[node].at(i)) == -1 )
  103. dfs(v[node].at(i));
  104. }
  105. ++timer;
  106. outtime.at(node) = timer;
  107. }
  108. int solve()
  109. {
  110. ll n;
  111. cin>>n;
  112.  
  113. ll elem,src;
  114. rep(i,1,n+1)
  115. {
  116. cin>>elem;
  117. if(elem != 0)
  118. {
  119. v[elem].eb(i);
  120. v[i].eb(elem);
  121. }
  122. else
  123. src = i;
  124. }
  125.  
  126. bfs(src);
  127. fill(all(visited),-1);
  128. dfs(src);
  129. // vomit(level,1,n+1);
  130.  
  131. cin>>src;
  132. ll elem1;
  133. while(src--)
  134. {
  135. cin>>elem>>elem1;
  136. if( intime.at(elem1) < intime.at(elem) and outtime.at(elem1) > outtime.at(elem))
  137. {
  138. cout<<level.at(elem)-level.at(elem1)-1<<"\n";
  139. }
  140. else
  141. cout<<"-1\n";
  142. }
  143. //resetting globals
  144. rep(i,0,N)
  145. v[i].clear();
  146. fill(all(level),-1);
  147. fill(all(visited),-1);
  148. timer = 0;
  149. intime.clear();
  150. outtime.clear();
  151. }
  152.  
  153. int main()
  154. {
  155. ios_base::sync_with_stdio(false);
  156. cin.tie(0);
  157. cout.tie(0);
  158. int TESTS=1;
  159. cin>>TESTS;
  160. while(TESTS--)
  161. {
  162. solve();
  163. }
  164. time
  165. return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement