Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. #define PIHAYEM_S_NOGI 1
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #ifdef PIHAYEM_S_NOGI
  5.     #pragma GCC optimize("Ofast")
  6.     #pragma GCC optimize("no-stack-protector")
  7.     #pragma GCC optimize("unroll-loops")
  8.     #pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
  9.     #pragma GCC optimize("fast-math")
  10.     #include <ext/pb_ds/assoc_container.hpp>
  11.     using namespace __gnu_pbds;
  12.     #define unordered_map gp_hash_table
  13. #endif
  14. #define dbg(x) cout << __func__ << ':' << __LINE__ << ' ' << #x << " = " << x << endl
  15. #define endl '\n'
  16. // #define int long long
  17. #define double long double
  18. #define sqr(x) (x) * (x)
  19. #define eb emplace_back
  20. #define pb push_back
  21. #define f first
  22. #define s second
  23. #define all(x) x.begin(), x.end()
  24.  
  25. vector<vector<int> > g;
  26. vector<vector<int> > c;
  27. vector<int> tin, tout;
  28. vector<int> fup;
  29. vector<bool> so;
  30. vector<int> clr;
  31. int col = 1;
  32. int timer = 0;
  33. void dfs(int v, int p = -1){
  34.     tin[v] = timer++;
  35.     fup[v] = tin[v];
  36.     int subtrees = 0;
  37.     for(int i = 0; i < g[v].size(); i++){
  38.         int to = g[v][i];
  39.         int cc = c[v][i];
  40.         if(to == p) continue;
  41.         if(tin[to] == -1){
  42.             dfs(to, v);
  43.             fup[v] = min(fup[v], fup[to]);
  44.             if (fup[to] > tin[v]){
  45.                 so[cc] = 1;
  46.             }
  47.             subtrees++;
  48.         } else{
  49.             fup[v] = min(fup[v], tin[to]);
  50.         }
  51.     }
  52.     tout[v] = timer++;
  53. }
  54.  
  55. void paint(int v){
  56.     clr[v] = col;
  57.     for(int i = 0; i < g[v].size(); i++){
  58.         int to = g[v][i];
  59.         int cc = c[v][i];
  60.         if(so[cc]) continue;
  61.         if(!clr[to]) paint(to);
  62.     }
  63. }
  64.  
  65. vector<set<int> > t;
  66. vector<vector<int> > up;
  67. vector<int> h;
  68.  
  69. void ddfs(int v, int p = -1, int hh = 0){
  70.     h[v] = hh;
  71.     if(p == -1) up[v][0] = v;
  72.     else up[v][0] = p;
  73.     for(int i = 1; i < 19; i++){
  74.         up[v][i] = up[up[v][i - 1]][i - 1];
  75.     }
  76.     for(int to: t[v]){
  77.         if(to == p) continue;
  78.         ddfs(to, v, hh + 1);
  79.     }
  80. }
  81.  
  82. void goUp(int &u, int &v){
  83.     int hc = min(h[u], h[v]);
  84.     for(int i = 18; i >= 0; i--){
  85.         if(h[up[u][i]] >= hc) u = up[u][i];
  86.         if(h[up[v][i]] >= hc) v = up[v][i];
  87.     }
  88. }
  89.  
  90. int lca(int u, int v){
  91.     goUp(u, v);
  92.     if(u == v) return u;
  93.     for(int i = 18; i >= 0; i--){
  94.         if(up[u][i] == up[v][i]) continue;
  95.         u = up[u][i];
  96.         v = up[v][i];
  97.     }
  98.     return up[v][0];
  99. }
  100.  
  101. signed main() {
  102.     srand(time(0));
  103. #ifdef DEBUG
  104.     freopen("input.txt", "r", stdin);
  105. #else
  106.     // freopen("convex.in", "r", stdin);
  107.     // freopen("convex.out", "w", stdout);
  108. #endif
  109.     ios_base::sync_with_stdio(false);
  110.     cin.tie(0);
  111.     cout.tie(0);
  112.     int n, m;
  113.     cin >> n >> m;
  114.     g.resize(n);
  115.     c.resize(n);
  116.     tin.resize(n, -1);
  117.     tout.resize(n);
  118.     fup.resize(n);
  119.     so.resize(m, 0);
  120.     clr.resize(n, 0);
  121.     int f;
  122.     cin >> f;
  123.     f--;
  124.     vector<pair<int, int> > e;
  125.     for(int i = 0; i < m; i++){
  126.         int u, v;
  127.         cin >> u >> v;
  128.         u--, v--;
  129.         e.push_back({u, v});
  130.         g[u].push_back(v);
  131.         c[v].push_back(i);
  132.         c[u].push_back(i);
  133.         g[v].push_back(u);
  134.     }
  135.     for(int v = 0; v < n; v++){
  136.         if(tin[v] == -1) dfs(v);
  137.     }
  138.     // for(int i = 0; i < m; i++) if(so[i]) cout << i + 1 << endl;
  139.     for(int v = 0; v < n; v++){
  140.         if(clr[v] == 0){
  141.             paint(v);
  142.             col++;
  143.         }
  144.     }
  145.     t.resize(col);
  146.     up.resize(col, vector<int>(19, 0));
  147.     h.resize(col);
  148.     for(auto a: e){
  149.         int u = a.first, v = a.second;
  150.         if(clr[v] == clr[u]) continue;
  151.         t[clr[v]].insert(clr[u]);
  152.         t[clr[u]].insert(clr[v]);
  153.     }
  154.     ddfs(clr[f]);
  155.     int k;
  156.     cin >> k;
  157.     for(int i = 0; i < k; i++){
  158.         int u, v;
  159.         cin >> u >> v;
  160.         u--, v--;
  161.         u = clr[u];
  162.         v = clr[v];
  163.         cout << h[lca(u, v)] << endl;
  164.     }
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement