#include #include #include using namespace std; const int LOG = 22; vector G[100010],ver[100010]; int parent[25][100010],d[100010]; void dfs(int v, int p){ for(int x:G[v]){ if(x==p) continue; parent[0][x] = v; d[x] = d[v] + 1; dfs(x,v); } } void init(int v,int root){ d[root] = 0; parent[0][root] = -1; dfs(root,-1); for(int k=0;k+1d[v]) swap(u,v); for(int k = 0;k=0;k--){ if(parent[k][u]!=parent[k][v]){ u = parent[k][u]; v = parent[k][v]; } } return parent[0][u]; } int dist(int u, int v){ int z = lca(u,v); return d[u] + d[v] - 2*d[z]; } int par[100010],sz[100010]; void unite_init(int n){ for(int i=0;i vec[100010]; multiset s[100010]; void dfs2(int v, int p){ if(s[find(v)].count(v)){ vec[find(v)].push_back(v); } for(int u:G[v]){ if(u==p) continue; dfs2(u,v); } } int main(){ int i,n,m,q; cin >> n >> m >> q; unite_init(n); for(i=0;i> u >> v; u--; v--; G[u].push_back(v); G[v].push_back(u); unite(u,v); } for(i=0;i> a >> b; a--; b--; if(same(a,b)){ ans += dist(a,b); }else{ s[find(a)].insert(a); s[find(b)].insert(b); } } for(i=0;i