Problem:
Score : 400 points

Problem Statement

An SNS has N users - User 1, User 2, \cdots, User N.

Between these N users, there are some relationships - M friendships and K blockships.

For each i = 1, 2, \cdots, M, there is a bidirectional friendship between User A_i and User B_i.

For each i = 1, 2, \cdots, K, there is a bidirectional blockship between User C_i and User D_i.

We define User a to be a friend candidate for User b when all of the following four conditions are satisfied:

a \neq b.

There is not a friendship between User a and User b.

There is not a blockship between User a and User b.

There exists a sequence c_0, c_1, c_2, \cdots, c_L consisting of integers between 1 and N (inclusive) such that c_0 = a, c_L = b, and there is a friendship between User c_i and c_{i+1} for each i = 0, 1, \cdots, L - 1.

For each user i = 1, 2, ... N, how many friend candidates does it have?

Constraints

All values in input are integers.

2 ≤ N ≤ 10^5

0 \leq M \leq 10^5

0 \leq K \leq 10^5

1 \leq A_i, B_i \leq N

A_i \neq B_i

1 \leq C_i, D_i \leq N

C_i \neq D_i

(A_i, B_i) \neq (A_j, B_j) (i \neq j)

(A_i, B_i) \neq (B_j, A_j)

(C_i, D_i) \neq (C_j, D_j) (i \neq j)

(C_i, D_i) \neq (D_j, C_j)

(A_i, B_i) \neq (C_j, D_j)

(A_i, B_i) \neq (D_j, C_j)

Input

Input is given from Standard Input in the following format:

N M K
A_1 B_1
\vdots
A_M B_M
C_1 D_1
\vdots
C_K D_K

Output

Print the answers in order, with space in between.

Sample Input 1

4 4 1
2 1
1 3
3 2
3 4
4 1

Sample Output 1

0 1 0 1

There is a friendship between User 2 and 3, and between 3 and 4. Also, there is no friendship or blockship between User 2 and 4. Thus, User 4 is a friend candidate for User 2.

However, neither User 1 or 3 is a friend candidate for User 2, so User 2 has one friend candidate.

Sample Input 2

5 10 0
1 2
1 3
1 4
1 5
3 2
2 4
2 5
4 3
5 3
4 5

Sample Output 2

0 0 0 0 0

Everyone is a friend of everyone else and has no friend candidate.

Sample Input 3

10 9 3
10 1
6 7
8 2
2 5
8 4
7 3
10 9
6 4
5 8
2 6
7 5
3 1

Sample Output 3

1 3 5 4 3 3 3 3 1 0

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/range/adaptor/reversed.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
typedef long long int ll;

#define PI (acos(-1))
#define REP(i,n) for(ll (i)=0;(i)<(n);(i)++)

#define dump(x)  cerr << #x << " = " << (x) << endl;
#define dumparr(x) cerr << #x ; for(auto elem: x){cerr << " " << elem;} cerr << endl;
#define dumppairs(x) cerr << #x ; for(auto elem: x){cerr << "(" << elem.first << " " << elem.second << ") ";} cerr << endl;
#define dumpline cerr << "**********************" << endl;
#define dumpwline(x) cerr << "******** " << #x << "=" << (x) << " ********" << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;
#define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0]))


ll n;


int main(void){
    cin >> n;
    ll m; cin >> m;
    ll k; cin >> k;
    vector <vector <ll>> G(n, vector<ll>());

    REP(i, m){
        ll a; cin >> a; a--;
        ll b; cin >> b; b--;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    vector<vector <ll>> B(n, vector<ll>());

    REP(i, k){
        ll a; cin >> a; a--;
        ll b; cin >> b; b--;
        B[a].push_back(b);
        B[b].push_back(a);
    }
    vector <bool> visited(n, false);
    vector <ll> ans(n, 0);
    REP(i, n){
        if(visited[i]){
            continue;
        }
        queue <ll> q;
        unordered_set <ll> s;
        vector <int> v;
        q.push(i);
        visited[i] = true;
        s.insert(i);
        v.push_back(i);
        while(!q.empty()){
            ll nxt = q.front();
            q.pop();
            for(auto tugi: G[nxt]){
                if (visited[tugi]){
                    continue;
                }
                visited[tugi] = true;
                s.insert(tugi);
                v.push_back(tugi);
                q.push(tugi);
            }
        }
        //dumparr(v)
        for(auto node: v){
            vector <ll> excluded;
            for(auto suki: G[node]){
                if(s.find(suki) != s.end()){
                    excluded.push_back(suki);
                    s.erase(suki);
                }
            }
            for(auto kirai: B[node]){
                if(s.find(kirai) != s.end()){
                    excluded.push_back(kirai);
                    s.erase(kirai);
                }
            }
            ans[node] = s.size() - 1;

            for(auto e: excluded){
                s.insert(e);
            }
        }
    }
    REP(i, n-1){
        cout << ans[i] << " ";
    }
    cout << ans[n-1] << endl;
    return 0;
}