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: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
struct fast_ios { fast_ios(){ cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_;
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((lint)(x).size())
#define POW2(n) (1LL << (n))
#define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++)
#define IFOR(i, begin, end) for(int i=(end)-1,i##_begin_=(begin);i>=i##_begin_;i--)
#define REP(i, n) FOR(i,0,n)
#define IREP(i, n) IFOR(i,0,n)
const lint mod=1e9+7;


bool f_path(std::vector<std::vector<int>> _fs, std::vector<bool>& _rc, int _a, int _b){
  REP(i,_fs[_a].size()){
    if(_fs[_a][i] == _b) return true;
  }
  REP(i,_fs[_a].size()){
    if(_rc[_fs[_a][i]] == false){
      _rc[_fs[_a][i]] = true;
      if(f_path(_fs,_rc,_fs[_a][i],_b)) return true;
    }
  }
  return false;
}

int main()
{
  lint n, m, k;
  cin >> n >> m >> k;
  std::vector<lint> a(m);
  std::vector<lint> b(m);
  REP(i,m) cin >> a[i] >> b[i];
  std::vector<lint> c(k);
  std::vector<lint> d(k);
  REP(i,k) cin >> c[i] >> d[i];

  // 隣接リストを作る
  std::vector<std::vector<int>> friends(n);
  REP(i,m){
    friends[a[i]-1].push_back(b[i]-1);
    friends[b[i]-1].push_back(a[i]-1);
  }
  //隣接行列は正しく作れてる
  /*
  REP(i,n){
    cout << i+1 << " : ";
    REP(j,friends[i].size()){
      cout << friends[i][j]+1 << " ";
    }
    cout << "\n";
  }*/

  // 探索
  std::vector<int> cnt(n,0);
  for(int i=0;i<n-1;i++){
    for(int j=i+1;j<n;j++){
      // 友人関係やブロック関係なら探索しない
      bool dont_srch = false;
      REP(s,m){
        if((a[s]-1 == i && b[s]-1 == j) || (a[s]-1 == j && b[s]-1 == i)){
          dont_srch = true;
          break;
        }
      }
      REP(s,k){
        if((c[s]-1 == i && d[s]-1 == j) || (c[s]-1 == j && d[s]-1 == i)){
          dont_srch = true;
          break;
        }
      }
      if(dont_srch) break;
      // 再起関数でiからjへのパスが見つかればカウント
      std::vector<bool> reach(n,false);
      if(f_path(friends, reach, i, j)){
        cnt[i]++;
        cnt[j]++;
      }
    }
  }

  REP(i,n) cout << cnt[i] << " ";
  cout << "\n";
  return 0;
}