Ganesh1648

Tree Difference - May Lunchtime codechef

Jun 1st, 2020
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. #define pb push_back
  6. #define vi vector<int>
  7. #define vpii vector<pair<int,int>>
  8. #define N (int)2e5+5
  9. #define f first
  10. #define s second
  11. #define all(x) x.begin(),x.end()
  12. //#define int long long int
  13. #define forn(i,n) for(int i=0;i<n;i++)
  14. #define fore(i,l,r) for(int i=l;i<r;i++)
  15. #define sz(a) (int)((a).size())
  16. #define ll long long
  17. #define ar array
  18. #define init(arr) memset(arr,0,sizeof(arr))
  19.  
  20. int n,q;
  21. vector<vi> adj;
  22. int dist[N];
  23. int parent[N];
  24.  
  25. void csort(vector<int> v)
  26. {
  27. int cnt[101];
  28. init(cnt);
  29. int len=sz(v);
  30. forn(i,len){
  31. cnt[v[i]]++;
  32. }
  33. fore(i,1,101){
  34. cnt[i]+=cnt[i-1];
  35. }
  36.  
  37. int b[len];
  38. init(b);
  39. for(int i=len-1;i>=0;i--)
  40. {
  41. b[cnt[v[i]]-1]=v[i];
  42. cnt[v[i]]--;
  43. }
  44.  
  45. int MAX=INT_MAX;
  46. for(int i=1;i<len;i++)
  47. MAX=min(MAX,abs(b[i]-b[i-1]));
  48.  
  49. cout<<MAX<<"\n";
  50. }
  51.  
  52. void lca(int u,int v,int arr[])
  53. {
  54. vector<int> list;
  55. list.pb(arr[u]);
  56. list.pb(arr[v]);
  57. bool vis[n+1];
  58. memset(vis,false,sizeof(vis));
  59. vis[u]=true;
  60. vis[v]=true;
  61. while(u!=v)
  62. {
  63. if(dist[u]>dist[v])
  64. {
  65. u=parent[u];
  66. if(!vis[u]){
  67. list.pb(arr[u]);
  68. vis[u]=true;
  69. }
  70. }
  71. else
  72. {
  73. v=parent[v];
  74. if(!vis[v]){
  75. list.pb(arr[v]);
  76. vis[v]=true;
  77. }
  78. }
  79. if(list.size()>100){
  80. cout<<0<<"\n";return;}
  81. }
  82. csort(list);
  83. }
  84.  
  85. void dfs(int u,int p,int h)
  86. {
  87. dist[u]=h;
  88. parent[u]=p;
  89. for(int v:adj[u])
  90. {
  91. if(v!=p)
  92. dfs(v,u,h+1);
  93. }
  94. }
  95.  
  96. void solve()
  97. {
  98. cin>>n>>q;
  99. int arr[n];
  100. forn(i,n)
  101. cin>>arr[i];
  102.  
  103. adj=vector<vi>(n);
  104. forn(i,n-1)
  105. {
  106. int u,v;
  107. cin>>u>>v;
  108. u--;
  109. v--;
  110. adj[u].pb(v);
  111. adj[v].pb(u);
  112. }
  113. init(dist);
  114. init(parent);
  115. dfs(0,-1,0);
  116. while(q-->0)
  117. {
  118. int u,v;
  119. cin>>u>>v;
  120. u--;v--;
  121. lca(u,v,arr);
  122. }
  123. }
  124.  
  125. int32_t main() {
  126. ios_base::sync_with_stdio(false);
  127. cin.tie(NULL);
  128. int t;
  129. cin>>t;
  130. while(t-->0)
  131. solve();
  132. }
Add Comment
Please, Sign In to add comment