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 JAVA (judge verdict: Memory Limit Exceeded)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;


public class Main {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws NumberFormatException 
	 */
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] tmpArray = br.readLine().split(" ");
		int n = Integer.parseInt(tmpArray[0]);
		int m = Integer.parseInt(tmpArray[1]);
		
		int[][] matrix = new int[n][n];
		
		for(int i = 0; i < n; i++){
			Arrays.fill(matrix[i], 0);
		}
		for(int i = 0 ; i < m; i++){
			tmpArray = br.readLine().split(" ");
			int id1 = Integer.parseInt(tmpArray[0]);
			int id2 = Integer.parseInt(tmpArray[1]);
			
			matrix[id1][id2] = 1;
			matrix[id2][id1] = 1;
			
		}
		
		int[] visited = new int[n];
		Arrays.fill(visited, 0);
		
		int q = Integer.parseInt( br.readLine());
		
		for(int i = 0; i < q; i++){
			tmpArray = br.readLine().split(" ");
			int start = Integer.parseInt(tmpArray[0]);
			int target = Integer.parseInt(tmpArray[1]);
			
			if(dfsSearch(matrix, visited, start, target)){
				System.out.println("yes");
			}
			else {
				System.out.println("no");
			}
			Arrays.fill(visited, 0);
		}
		/*
		int time = 0;
		for(int i = 1; i <= n ; i++){
			if(visited[i] <= 0){
				time = dfs(matrix, visited, finished, i, time);
			}
		}
		
		for(int i = 1; i <= n ; i++){
			System.out.println(i + " " + visited[i] + " " + finished[i]);
		}*/
		/*
		for(int i = 0; i < n; i++){
			for(int j = 0 ; j < n ; j++){
				if(j == 0){
					System.out.print(matrix[i][j]);
				}
				else {
					System.out.print(" "+matrix[i][j]);
				}
			}
			System.out.println();
		}
		*/
		
	}
	
	static boolean dfsSearch (int[][] matrix, int[] visited, int v, int targetID){
		//System.out.println("current vertex is "+v);
		visited[v] = 1;
		boolean found = false;
		
		for(int i = 0; i < matrix[v].length ; i++){
			if(matrix[v][i] == 1 && visited[i] <= 0){
				if(i == targetID){
					return true;
				}
				found = dfsSearch(matrix, visited, i, targetID);
				if(found){
					return true;
				}
			}
		}
		
		return false;
	}

}