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)

#include <stdio.h>

#define WHITE 1
#define GRAY 0
#define BLACK -1


void bfs(int);
void enqueue(int);
int dequeue(void);

int color[100002],n,vv[100002][102],k[100002],Q[100002];
int head, tail;

int main()
{
  int i,m,q,s,t;

  /* n ユーザ数 */
  /* m 友達関係の数 */

  scanf("%d %d",&n,&m);

  head = 0;
  tail = 0;
  for(i=0;i<n;i++){
    k[i]=0;
  }

  //友達関係をinput
  for(i=0;i<m;i++){
    scanf("%d%d",&s,&t);
    vv[t][k[t]]=s;
    vv[s][k[s]]=t;
    k[s]++;
    k[t]++;
  }

  //質問をinput
  scanf("%d",&q);
  for(i=0;i<q;i++){
    scanf("%d%d",&s,&t);

    bfs(s);

    if(color[t]==WHITE) printf("no\n");
    else printf("yes\n");
  }

  return 0;
}

void bfs(int s){
  int i,u,v;

  for (u=0;u<n;u++){
    color[u] = WHITE;
  }
  color[s] = GRAY;
  enqueue(s);

  while(head!=tail){
    u = dequeue();
    for(i=0;i<k[u];i++){
      v=vv[u][i];
 
      if (color[v] == WHITE){

	color[v] = GRAY;
	enqueue(v);
      }
      color[u] = BLACK;
    }
  }
}

void enqueue(int x){ /* キューの末尾に要素 x を追加 */
  Q[tail] = x;
  if (tail + 1 == n) tail = 0;
  else tail++;
}

int dequeue(void){ /* キューの先頭から要素を取り出す */
  int x;
  x = Q[head];
  if (head + 1 == n) head = 0;
  else head++;
  return x;
}