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;

namespace ALDS1_11D{
    public class Program{
        public static void Main(string[] args){
            var sr = new StreamReader();
            //---------------------------------
            var N = sr.Next<int>();

            var g = new List<int>[N];
            for(var i = 0; i < N; i++){
                g[i] = new List<int>();
            }

            var M = sr.Next<int>();
            for(var i = 0; i < M; i++){
                var S = sr.Next<int>();
                var T = sr.Next<int>();
                g[S].Add(T);
                g[T].Add(S);
            }

            var cnt = 0;
            var color = new int[N];

            Action<int> bfs = x =>{
                if(color[x] != 0) return;
                var que = new Queue<int>();
                color[x] = ++cnt;
                que.Enqueue(x);

                while(que.Count > 0){
                    var now = que.Dequeue();
                    foreach(var next in g[now]){
                        if(color[next] != 0) continue;

                        color[next] = cnt;
                        que.Enqueue(next);
                    }
                }
            };

            for(var i = 0; i < N; i++) bfs(i);

            var Q = sr.Next<int>();
            for(var i = 0; i < Q; i++){
                var S = sr.Next<int>();
                var T = sr.Next<int>();
                Console.WriteLine(color[S] == color[T] ? "yes" : "no");
            }
            //---------------------------------
        }
    }

    public class StreamReader{
        private readonly char[] _c = {' '};
        private int _index = -1;
        private string[] _input = new string[0];

        public T Next<T>(){
            if(_index == _input.Length - 1){
                _index = -1;
                while(true){
                    string rl = Console.ReadLine();
                    if(rl == null){
                        if(typeof(T).IsClass) return default(T);
                        return (T)typeof(T).GetField("MinValue").GetValue(null);
                    }
                    if(rl != ""){
                        _input = rl.Split(_c, StringSplitOptions.RemoveEmptyEntries);
                        break;
                    }
                }
            }
            return (T)Convert.ChangeType(_input[++_index], typeof(T), System.Globalization.CultureInfo.InvariantCulture);
        }
    }
}