func_code_string: #include <bits/stdc++.h>   using namespace std;   const int SZ = 2000010;   const int INF = 1e9 + 10;   const int mod = 1e9 + 7;   const long double eps = 1e-8;   long long read() {     long long n = 0;     char a = getchar();     bool flag = 0;     while (a >  9  || a <  0 ) {       if (a ==  - ) flag = 1;       a = getchar();     }     while (a <=  9  && a >=  0 ) {       n = n * 10 + a -  0 , a = getchar();     }     if (flag) n = -n;     return n;   }   vector<int> g2[SZ];   vector<int> g[SZ];   int n, m, q;   int ccnt = 0;   int dfn[SZ], low[SZ], dfs_clock;   stack<int> S;   bool cut[SZ], ins[SZ];   void Tarjan(int u, int f) {     dfn[u] = low[u] = ++dfs_clock;     S.push(u);     ins[u] = 1;     int child = 0;     for (int i = 0; i < g2[u].size(); i++) {       int v = g2[u][i];       if (v == f) continue;       if (!dfn[v]) {         child++;         Tarjan(v, u);         low[u] = min(low[u], low[v]);         if (low[v] >= dfn[u]) {           ccnt++;           cut[u] = 1;           int x;           do {             x = S.top();             S.pop();             ins[x] = 0;             g[ccnt + n].push_back(x);             g[x].push_back(ccnt + n);           } while (x != v && !S.empty());           g[ccnt + n].push_back(u);           g[u].push_back(ccnt + n);         }       } else if (ins[v]) {         low[u] = min(low[u], dfn[v]);       }     }     if (f == 0 && child == 1) cut[u] = 0;   }   int anc[SZ][22], deep[SZ];   void dfsLca(int u, int f) {     deep[u] = deep[f] + 1;     anc[u][0] = f;     for (int i = 1; anc[u][i - 1]; i++) anc[u][i] = anc[anc[u][i - 1]][i - 1];     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (v == f) continue;       dfsLca(v, u);     }   }   int askLca(int u, int v) {     if (deep[u] < deep[v]) swap(u, v);     int dd = deep[u] - deep[v];     for (int i = 20; i >= 0; i--)       if (dd >> i & 1) u = anc[u][i];     if (u == v) return u;     for (int i = 20; i >= 0; i--)       if (anc[u][i] != anc[v][i]) u = anc[u][i], v = anc[v][i];     return anc[u][0];   }   int main() {     n = read(), m = read(), q = read();     for (int i = 1; i <= m; i++) {       int x = read(), y = read();       g2[x].push_back(y);       g2[y].push_back(x);     }     Tarjan(1, 0);     n += ccnt;     dfsLca(1, 0);     while (q--) {       int x = read(), y = read();       int lca = askLca(x, y);       int ans = deep[x] + deep[y] - 2 * deep[lca];       printf( %d n , ans / 2);     }     return 0;   }   