int dfn[400005], low[400005], tme, q[400005], top; vector<int> e[400005]; int f[400005];
voidtarjan(int x){ dfn[x] = low[x] = ++tme; q[++top] = x; int now = 0; for (int i = head[x]; i; i = pre[i]) { int y = to[i]; if (!dfn[y]) { tarjan(y); low[x] = min(low[x], low[y]); if (dfn[x] <= low[y]) { n++; int z = 0; do { z = q[top]; e[n].push_back(z); e[z].push_back(n); top--; } while (z != y); e[n].push_back(x); e[x].push_back(n); } } else { low[x] = min(low[x], dfn[y]); } } }
int d[400005], p[400005][21];
voiddfs1(int x, int fa){ for (int i = 0; i < e[x].size(); i++) { int y = e[x][i]; if (y == fa) continue; d[y] = d[x] + 1; p[y][0] = x; dfs1(y, x); } }
intLCA(int x, int y){ if (d[x] < d[y]) swap(x, y); for (int i = 20; i >= 0; i--) { if (d[x] - (1 << i) >= d[y]) x = p[x][i]; } if (x == y) return x; for (int i = 20; i >= 0; i--) { if (p[x][i] != p[y][i]) { x = p[x][i]; y = p[y][i]; } } return p[x][0]; }
voiddfs(int x, int fa){ for (int i = 0; i < e[x].size(); i++) { int y = e[x][i]; if (y == fa) continue; dfs(y, x); f[x] += f[y]; } }
intmain(){ read(n); nn = n; read(m); read(Q); for (int i = 1; i <= m; i++) { int a, b; read(a); read(b); addedge(a, b); } tarjan(1); dfs1(1, 0); for (int l = 1; (1 << l) <= n; l++) { for (int i = 1; i <= n; i++) { p[i][l] = p[p[i][l-1]][l-1]; } } for (int i = 1; i <= Q; i++) { int x, y, lca; read(x); read(y); lca = LCA(x, y); f[x]++; f[y]++; f[lca]--; f[p[lca][0]]--; } dfs(1, 0); for (int i = 1; i <= nn; i++) { printf("%d\n", f[i]); } return0; }