Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Connected Components

Write a program which reads relations in a SNS (Social Network Service), and judges that given pairs of users are reachable each other through the network.

Input

In the first line, two integer $n$ and $m$ are given. $n$ is the number of users in the SNS and $m$ is the number of relations in the SNS. The users in the SNS are identified by IDs $0, 1, ..., n-1$.

In the following $m$ lines, the relations are given. Each relation is given by two integers $s$ and $t$ that represents $s$ and $t$ are friends (and reachable each other).

In the next line, the number of queries $q$ is given. In the following $q$ lines, $q$ queries are given respectively. Each query consists of two integers $s$ and $t$ separated by a space character.

Output

For each query, print "yes" if $t$ is reachable from $s$ through the social network, "no" otherwise.

Constraints

$2 \leq n \leq 100,000$

$0 \leq m \leq 100,000$

$1 \leq q \leq 10,000$

Sample Input

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

Sample Output

yes
yes
no

Solution in C# (judge verdict: Accepted)

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

namespace ConsoleApplication1
{
    class UnionFindNode
    {
        internal UnionFindNode parent;
        internal int rank;
    }

    class UnionFind
    {
        Dictionary<object, UnionFindNode> _dict;

        public UnionFind()
        {
            _dict = new Dictionary<object, UnionFindNode>();
        }

        public void Unite(IComparable x, IComparable y)
        {
            var xRoot = Root(x);
            var yRoot = Root(y);

            if (xRoot == yRoot) return;

            if (xRoot.rank < yRoot.rank)
            {
                xRoot.parent = yRoot;
            }
            else
            {
                yRoot.parent = xRoot;

                if (xRoot.rank == yRoot.rank) xRoot.rank++;
            }
        }

        public bool IsSame(IComparable x, IComparable y)
        {
            return Root(x) == Root(y);
        }

        UnionFindNode Root(object obj)
        {
            if (!_dict.ContainsKey(obj))
            {
                var node = new UnionFindNode();
                _dict.Add(obj, node);
                return node;
            }
            else
            {
                var node = _dict[obj];
                return Find(node);
            }
        }

        UnionFindNode Find(UnionFindNode node)
        {
            if (node.parent == null) return node;

            return node.parent = Find(node.parent);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Split(' ');
            int m = int.Parse(input[1]);

            UnionFind uf = new UnionFind();

            for(int i = 0; i < m; i++)
            {
                input = Console.ReadLine().Split(' ');
                int x = int.Parse(input[0]);
                int y = int.Parse(input[1]);

                uf.Unite(x, y);
            }

            int q = int.Parse(Console.ReadLine());

            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < q; i++)
            {
                input = Console.ReadLine().Split(' ');
                int x = int.Parse(input[0]);
                int y = int.Parse(input[1]);

                sb.AppendLine(uf.IsSame(x, y) ? "yes" : "no");
            }
            Console.Write(sb);
        }
    }
}