A C C o d e \rm{AC\ Code} AC Code
#define maxn 200005
#define maxm 400005
#define pb push_back
using namespace std;
int n,m,q,cnt_p;
int info[maxn],Prev[maxm],to[maxm],cnt_e;
void Node(int u,int v){ Prev[++cnt_e]=info[u],to[cnt_e]=v,info[u]=cnt_e; }
int dfn[maxn],low[maxn],tot;
int sta[maxm],vis[maxn],ans[maxn];
vector<int>G[maxn],P[maxn];
void dfs(int u,int ff){
dfn[u] = low[u] = ++tot;
sta[++sta[0]] = u;
for(int i=info[u],v;i;i=Prev[i])
if(!dfn[v=to[i]]){
dfs(v,u),low[u]=min(low[u],low[v]);
if(low[v] >= dfn[u]){
G[++cnt_p].pb(u),G[u].pb(cnt_p);
for(int t=-1;t!=v;)//注意这里是到$V$,中间可能有返祖边。
G[cnt_p].pb(t=sta[sta[0]--]),
G[t].pb(cnt_p);
}
}
else if(v != ff) low[u] = min(low[u] , dfn[v]);
}
int F[maxn],fa[maxn];
int Find(int u){ return !F[u] ? u : F[u] = Find(F[u]); }
void dfs1(int u,int ff){
fa[u] = ff;
vis[u] = 1;
for(int v:P[u])
if(vis[v])
ans[Find(v)] -- , ans[fa[Find(v)]]--;
for(int v:G[u])
if(v!=ff){
dfs1(v,u);
ans[u] += ans[v];
}
F[u] = ff;
}
int main(){
scanf("%d%d%d",&n,&m,&q);cnt_p=n;
for(int i=1,x,y;i<=m;i++)
scanf("%d%d",&x,&y),Node(x,y),Node(y,x);
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i,0);
for(int x,y;q--;){
scanf("%d%d",&x,&y),ans[x]++,ans[y]++;
P[x].pb(y),P[y].pb(x);
}
for(int i=1;i<=cnt_p;i++)
if(!vis[i])
dfs1(i,0);
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}