Pagini recente » Cod sursa (job #354424) | Cod sursa (job #430321) | Cod sursa (job #3178707) | Cod sursa (job #1733369) | Cod sursa (job #2582508)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
private static final int QUERY_UNION = 1;
private static final int QUERY_ARE_SAME_SET = 2;
private static final String QUERY_ARE_SAME_SET_YES = "DA";
private static final String QUERY_ARE_SAME_SET_NO = "NU";
public static final void main(final String[] argv) throws IOException {
final BufferedReader in = new BufferedReader(new FileReader("disjoint.in"));
final BufferedWriter out = new BufferedWriter(new FileWriter("disjoint.out"));
final int[] nAndM = parseLine(in.readLine());
final int N = nAndM[0];
final int M = nAndM[1];
final int[] sets = new int[1 + N];
final int[] rank = new int[1 + N];
for (int pos = 1; pos <= N; ++pos) {
sets[pos] = pos;
rank[pos] = 1;
}
for (int query = 0; query < M; ++query) {
final int[] queryData = parseLine(in.readLine());
final int qType = queryData[0];
final int x = queryData[1];
final int y = queryData[2];
switch (qType) {
case QUERY_UNION: {
final int setOfX = setOf(x, sets);
final int setOfY = setOf(y, sets);
if (rank[setOfX] < rank[setOfY]) {
sets[setOfX] = setOfY;
} else {
sets[setOfY] = setOfX;
}
if (rank[setOfX] == rank[setOfY]) {
++rank[setOfX];
++rank[setOfY];
}
break;
}
case QUERY_ARE_SAME_SET: {
out.write((setOf(x, sets) == setOf(y, sets) ? QUERY_ARE_SAME_SET_YES : QUERY_ARE_SAME_SET_NO) + "\n");
break;
}
}
}
in.close();
out.flush();
out.close();
}
private static final int setOf(final int of, final int[] sets) {
int x = of;
int setOfX = sets[of];
while (x != setOfX) {
x = setOfX;
setOfX = sets[x];
}
x = of;
while (x != setOfX) {
final int nextX = sets[x];
sets[x] = setOfX;
x = nextX;
}
return setOfX;
}
private static final int[] parseLine(final String line) {
final String[] words = line.split(" ");
final int[] intWords = new int[words.length];
for (int wordPos = 0; wordPos < words.length; ++wordPos) {
intWords[wordPos] = Integer.parseInt(words[wordPos]);
}
return intWords;
}
}