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)

#include <stdio.h>
 #include <stdlib.h>
    
 int n, m;
    
 void merge(int *u, int *net, int oldnet, int newnet);
    
 int main(int argc, char *argv[])
 {
   int i, s, t, p, q;
   int *u;
   int *net;
    
   scanf("%d", &n);
   scanf("%d", &m);
   u = (int *)malloc(sizeof(int) * n);
   net = (int *)malloc(sizeof(int) * (m + 1));
   for (i = 0; i < n; i++) u[i] = -1;
   for (i = 0; i <= m; i++) net[i] = 0;
    
   p = 1;
    
   for (i = 0; i < m; i++) {
     scanf("%d", &s);
     scanf("%d", &t);
     if (s != t) {
       if (u[s] == -1 && u[t] == -1) {
     u[s] = p;
     u[t] = p;
     net[p] += 2;
     p++;
       } else {
     if (u[s] != -1 && u[t] == -1) {
       u[t] = u[s];
       net[u[s]]++;
     } else if (u[s] == -1 && u[t] != -1) {
       u[s] = u[t];
       net[u[t]]++;
     } else {
       if (u[s] != u[t]) {
         if (net[u[s]] > net[u[t]]) merge(u, net, u[t], u[s]);
         else merge(u, net, u[s], u[t]);
       }
     }
       }
     }
   }
    
  scanf("%d", &q);
   
  for (i = 0; i < q; i++) {
    scanf("%d", &s);
    scanf("%d", &t);
   
    if (s == t) printf("yes\n");
    else {
      if (u[s] == u[t] && u[s] != -1 && u[t] != -1) printf("yes\n");
      else printf("no\n");
    }
  }
   
  return 0;
}
   
void merge(int *u, int *net, int oldnet, int newnet)
{
  int i;
     
  for (i = 0; i < n; i++) {
    if (u[i] == oldnet) u[i] = newnet;
  }
   
  net[newnet] += net[oldnet];
  net[oldnet] = 0;
}