Pagini recente » Cod sursa (job #375747) | Cod sursa (job #2477455) | Cod sursa (job #555548) | Cod sursa (job #2927987) | Cod sursa (job #2629241)
#include <bits/stdc++.h>
using namespace std;
class InParser {
private:
FILE *fin;
char *buff;
int sp;
char read_ch() {
++sp;
if (sp == 4096) {
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char* nume) {
fin = fopen(nume, "r");
buff = new char[4096]();
sp = 4095;
}
InParser& operator >> (int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-');
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
};
int *parent, *children;
int _find (int x) {
if (parent[x]==x)
return x;
return parent[x]=_find(parent[x]);
}
void _union (int x, int y) {
x=_find(x);
y=_find(y);
if (x!=y)
if (children[x] > children[y]) {
parent[x] = y;
children[y] += children[x];
}
else {
parent[y] = x;
children[x] += children[y];
}
}
int main () {
InParser fin ("disjoint.in");
FILE *fout=fopen("disjoint.out", "w");
int n, m;
fin >> n >> m;
parent=new int[n+1];
children=new int[n+1];
iota(parent, parent+n+1, 0);
fill(children, children+n+1, 1);
int i, j, k;
for (; m; m--) {
fin >> k >> i >> j;
if (k==1)
_union(i, j);
else
fputs(_find(i)==_find(j)?"DA\n":"NU\n", fout);
}
return 0;
}