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: Time Limit Exceeded)

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

namespace ALDS1_11_D_ConnectedComponents
{
	class Program
	{
		static void Main ( string[] args )
		{
			int[] inputNum = Array.ConvertAll (Console.ReadLine ().Split (' '), int.Parse);
			Gragh graph = new Gragh (inputNum[0]);

			for (int lp = 0; lp < inputNum[1]; lp++)
			{
				int[] adjacencyPair = Array.ConvertAll (Console.ReadLine ().Split (' '), int.Parse);

				graph.GetPath (adjacencyPair[0], adjacencyPair[1]);
			}

			graph.SetRoot ();

			int judgeCount = int.Parse (Console.ReadLine ());
			StringBuilder output = new StringBuilder (3 * judgeCount);

			for (int lp = 0; lp < judgeCount; lp++)
			{
				int[] adjacencyPair = Array.ConvertAll (Console.ReadLine ().Split (' '), int.Parse);

				if (graph.IsAdjacency (adjacencyPair[0], adjacencyPair[1]))
				{
					output.AppendLine ("yes");
				}
				else
				{
					output.AppendLine ("no");
				}
			}
			Console.Write (output);
		}
	}

	class Gragh
	{
		public Gragh ( int size )
		{
			this.Size = size;
			this.AdjacencyList = new List<int>[this.Size];

			int capacity = 2;
			for (int lp = 0; lp < this.Size; lp++)
			{
				this.AdjacencyList[lp] = new List<int> (capacity);
			}

			this.Group = new int[this.Size];
		}

		private List<int>[] AdjacencyList { set; get; }
		private int Size { set; get; }
		private int[] Group { set; get; }
		private const int Initialize = 0;

		private const int NotVisited = 0;
		private const int Stay = 1;
		private const int Visited = 2;

		public void GetPath ( int beginPoint, int adjacencyPoint )
		{
			AdjacencyList[beginPoint].Add (adjacencyPoint);
			AdjacencyList[adjacencyPoint].Add (beginPoint);
		}

		public void SetRoot ()
		{
			int groupNumber = Initialize + 1;

			for (int lp = 0; lp < Size; lp++)
			{
				if (Group[lp] == Initialize)
				{
					BreathFirstSearch (lp, groupNumber);
					groupNumber++;
				}
			}
		}

		private void BreathFirstSearch ( int beginSearchPoint, int groupNumber )
		{
			//initialize
			Queue<int> searchPoint = new Queue<int> (Size / 10);
			int[] visitState = new int[Size];

			//process
			searchPoint.Enqueue (beginSearchPoint);

			while (searchPoint.Count != 0)
			{
				int element = searchPoint.Dequeue ();
				visitState[element] = Visited;

				foreach (var item in AdjacencyList[element])
				{
					Group[item] = groupNumber;

					if (visitState[item] == NotVisited)
					{
						searchPoint.Enqueue (item);
						visitState[item] = Stay;
					}
				}
			}
		}

		public bool IsAdjacency ( int beginPoint, int adjacencyPoint )
		{
			return Group[beginPoint] == Group[adjacencyPoint] && Group[beginPoint] != Initialize;
		}
	}
}