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.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;

namespace AOJ
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }

        static void Main(string[] args)
        {
            var NM = Sarray();
            var N = NM[0];
            var M = NM[1];
            var rin = new List<long>[N];
            for (var i = 0; i < N; ++i)
            {
                rin[i] = new List<long>();
            }
            for(var i=0;i<M;++i)
            { 
                var fr = Sarray();
                rin[fr[0]].Add(fr[1]);
                rin[fr[1]].Add(fr[0]);
            }
            var d = new long[N];
            var uni = 0;
            for (var j = 0; j < N; ++j)
            {
                if (d[j] != 0) continue;
                var q = new Queue<long>();
                q.Enqueue(j);
                ++uni;
                d[j] = uni;
                while (q.Any())
                {
                    var v = q.Dequeue();
                    foreach (var n in rin[v])
                    {
                        if (d[n] == 0)
                        {
                            q.Enqueue(n);
                            d[n] = uni;
                        }
                    }
                }
            }
            var Q = Sarray()[0];
            for (var i = 0; i < Q; ++i)
            {
                var st = Sarray();
                if (d[st[0]] == d[st[1]] && d[st[0]] != -1)
                    WriteLine("yes");
                else
                    WriteLine("no");
            }
        }
    }
}