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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

namespace D
{
    internal struct Tree
    {
        private readonly int[] _parents;

        public Tree(int n)
        {
            _parents = new int[n];

            for (var i = 0; i < n; ++i)
            {
                _parents[i] = i;
            }
        }

        public int GetRoot(int i)
        {
            if (_parents[i] == i)
            {
                return i;
            }

            return _parents[i] = GetRoot(_parents[i]);
        }

        public void Connect(int a, int b)
        {
            var ra = GetRoot(a);
            var rb = GetRoot(b);

            if (ra != rb)
            {
                _parents[ra] = rb;
            }
        }
    }
    
    internal static class Program
    {
        private static void Main(string[] args)
        {
            /*
             * Inputs
             */
            
            var n = Cint();
            var m = Cint();
            var k = Cint();

            var a = new int[m];
            var b = new int[m];

            Loop(m, i =>
            {
                a[i] = Cint() - 1;
                b[i] = Cint() - 1;
            });

            var c = new int[k];
            var d = new int[k];
            
            Loop(k, i =>
            {
                c[i] = Cint() - 1;
                d[i] = Cint() - 1;
            });
            
            /*
             * Solver
             */

            var tree = new Tree(n);

            var friends = new List<int>[n];
            var blocked = new List<int>[n];
            
            Loop(n, i =>
            {
                friends[i] = new List<int>();
                blocked[i] = new List<int>();
            });
            
            Loop(m, i =>
            {
                friends[a[i]].Add(b[i]);
                friends[b[i]].Add(a[i]);
                
                tree.Connect(a[i], b[i]);
            });

            Loop(k, i =>
            {
                blocked[c[i]].Add(d[i]);
                blocked[d[i]].Add(c[i]);
            });
            
            var groups = new Dictionary<int, List<int>>();

            Loop(n, i =>
            {
                var root = tree.GetRoot(i);
                if (!groups.ContainsKey(root))
                {
                    groups.Add(root, new List<int>());
                }

                groups[root].Add(i);
            });

            /*
             * Outputs
             */

            var answer = new int[n];
            
            Loop(n, i =>
            {
                var root = tree.GetRoot(i);
                var group = groups[root];
                var size = group.Count;
                var friendsCount = friends[i].Count(f => tree.GetRoot(f) == root);
                var blockedCount = blocked[i].Count(g => tree.GetRoot(g) == root);

                answer[i] = size - friendsCount - blockedCount - 1;
            });
            
            Cout(
                string.Join(
                    " ",
                    answer.Select(i => i.ToString())
                )
            );
        }

        #region Input and Output

        private static readonly List<string> Buffer = new List<string>();

        private static string Cin()
        {
            ReadBuffer();

            var str = Buffer.First();
            Buffer.RemoveAt(0);

            return str;
        }

        private static IEnumerable<string> CinA() => Console.ReadLine()?.Split();
        private static int Cint() => int.Parse(Cin());
        private static int[] CintA() => CinA().Select(int.Parse).ToArray();
        private static void Cout(object obj) => Console.WriteLine(obj);

        private static void ReadBuffer()
        {
            if (Buffer.Any()) return;

            var line = Console.ReadLine();
            if (line != null && line.Contains(' '))
            {
                Buffer.AddRange(line.Split());
            }
            else
            {
                Buffer.Add(line);
            }
        }

        #endregion

        #region Loops

        private static void Loop(int count, Action<int> action) => Loop(0, count, action);

        private static void Loop(int init, int count, Action<int> action, int step = 1)
        {
            for (var i = init; i < count + init; i += step)
            {
                action(i);
            }
        }

        #endregion
    }
}