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>

#define REALLOC_SIZE 256
#define NIL -1

typedef struct _node {
	int friendId;
	int childNum;
	int *childHead;
} node;

typedef struct _queue {
	int head;
	int tail;
	int *ary;
} queue;

void enqueu(queue *q, int value) {
	q->ary[q->tail++] = value;
}

int dequeue(queue *q) {
	return q->ary[q->head++];
}

void allocNode(node *p) {
	p->friendId = NIL;
	p->childNum = 0;
	p->childHead = (int *)malloc(sizeof(int) * REALLOC_SIZE);
}

int *getNewPtr(node *p) {
	int size;
	int *tmp;
	size = p->childNum / REALLOC_SIZE;
	tmp = (int *)realloc(p->childHead, sizeof(int) * REALLOC_SIZE * size);
	if (tmp == NULL) exit(1);
	return tmp;
}

void bfs(node *top, int cur, queue* q, int friendId) {
	int i, u, v;
	q->head = q->tail = 0;
	enqueu(q, cur);
	top[cur].friendId = friendId;
	while (q->head != q->tail) {
		u = dequeue(q);
		for (i = 0; i < top[u].childNum; i++) {
			v = top[u].childHead[i];
			if (top[v].friendId == NIL) {
				enqueu(q, v);
				top[v].friendId = friendId;
			}
		}
	}
}

void setFriendId(node *top,queue *q, int n) {
	int i, friendId;
	friendId = 0;
	for (i = 0; i < n; i++) {
		if (top[i].friendId == NIL) bfs(top, i, q, friendId++);
	}
}

int main() {
	int i, n, m, s, t, q, q1, q2;
	node *top;
	queue queue;

	scanf("%d %d", &n, &m);
	top = (node *)malloc(sizeof(node) * n);
	for (i = 0; i < n; i++) allocNode(&top[i]);
	queue.ary = (int *)malloc(sizeof(int) * n);

	for (i = 0; i < m; i++) {
		scanf("%d %d", &s, &t);
		top[s].childHead[top[s].childNum++] = t;
		top[t].childHead[top[t].childNum++] = s;
		if (top[s].childNum % REALLOC_SIZE == 0) top[s].childHead = getNewPtr(&top[s]);
		if (top[t].childNum % REALLOC_SIZE == 0) top[t].childHead = getNewPtr(&top[t]);
	}

	setFriendId(top, &queue, n);

	scanf("%d", &q);
	for (i = 0; i < q; i++) {
		scanf("%d %d", &q1, &q2);
		if (top[q1].friendId == top[q2].friendId) printf("yes\n");
		else printf("no\n");
	}

	for (i = 0; i < n; i++)	free(top[i].childHead);
	free(queue.ary);
	return 0;
}