func_code_string: #include <bits/stdc++.h>   using namespace std;   int dfn[200002], low[200002], tot, head[200002], num, f[200002];   int p[20][200002];   int deep[200002], n, m, q, st[200002], top, dep[200002];   bool vis[200002];   inline long long rd() {     long long x = 0;     char c = getchar();     bool f = 0;     while (!isdigit(c)) {       if (c ==  - ) f = 1;       c = getchar();     }     while (isdigit(c)) {       x = (x << 1) + (x << 3) + (c ^ 48);       c = getchar();     }     return f ? -x : x;   }   struct edge {     int n, to;   } e[200002];   inline void add(int u, int v) {     e[++tot].n = head[u];     e[tot].to = v;     head[u] = tot;   }   vector<int> vec[200002];   void tarjan(int u, int fa) {     dfn[u] = low[u] = ++dfn[0];     st[++top] = u;     vis[u] = 1;     for (vector<int>::iterator it = vec[u].begin(); it != vec[u].end(); ++it) {       int v = *it;       if (v == fa) continue;       if (!dfn[v]) {         tarjan(v, u);         low[u] = min(low[u], low[v]);         if (low[v] == dfn[u]) {           ++num;           add(u, num);           int x = 0;           while (x != v) {             x = st[top];             add(num, x);             vis[x] = 0;             top--;           }         }         if (low[v] > dfn[u]) {           add(u, v);           vis[st[top]] = 0;           top--;         }       } else if (vis[v])         low[u] = min(low[u], dfn[v]);     }   }   void dfs(int u, int fa) {     for (int i = 1; (1 << i) <= deep[u]; ++i) p[i][u] = p[i - 1][p[i - 1][u]];     for (int i = head[u]; i; i = e[i].n)       if (e[i].to != fa) {         int v = e[i].to;         f[v] = u;         deep[v] = deep[u] + 1;         p[0][v] = u;         dep[v] = dep[u] + (v > n);         dfs(v, u);       }   }   inline int getlca(int u, int v) {     if (deep[u] < deep[v]) swap(u, v);     for (int i = 19; i >= 0; --i)       if (deep[u] - (1 << i) >= deep[v]) u = p[i][u];     if (u == v) return u;     for (int i = 19; i >= 0; --i)       if (p[i][u] != p[i][v]) u = p[i][u], v = p[i][v];     return p[0][u];   }   inline int dist(int u, int v) {     int lca = getlca(u, v);     return deep[u] + deep[v] - 2 * deep[lca] -            (dep[u] + dep[v] - dep[lca] - dep[f[lca]]);   }   int main() {     n = rd();     m = rd();     q = rd();     int u, v;     for (int i = 1; i <= m; ++i) {       u = rd();       v = rd();       vec[u].push_back(v);       vec[v].push_back(u);     }     num = n;     tarjan(1, 0);     dfs(1, 0);     while (q--) {       u = rd();       v = rd();       printf( %d n , dist(u, v));     }     return 0;   }   