Pagini recente » Cod sursa (job #1201311) | Cod sursa (job #747920) | Cod sursa (job #2583012) | Cod sursa (job #1644623) | Cod sursa (job #2977198)
#include <fstream>
#include <vector>
using namespace std;
class inparser{
vector<char>str;
int ptr;
ifstream fin;
char getchar()
{
if(ptr==int(str.size()))
{
fin.read(str.data(),str.size());
ptr=0;
}
return str[ptr++];
}
template<class T>
T getint()
{
char chr=getchar();
if(!isdigit(chr)&&chr!='-')
chr=getchar();
int sgn=+1;
if(chr=='-')
{
sgn=-1;
chr=getchar();
}
T numar=0;
while(isdigit(chr))
{
numar=numar*10+chr-'0';
chr=getchar();
}
return numar*sgn;
}
public:
inparser(char *name): str(1e5),ptr(int(str.size())),fin(name){}
~inparser(){fin.close();}
template<class T>
friend inparser & operator >> (inparser & in,T &numar)
{
numar=in.template getint<T>();
return in;
}
};
inparser fin("disjoint.in");
ofstream fout("disjoint.out");
constexpr size_t LIM = 1e5 + 1;
int F[LIM];
static inline int get_root(int node) {
int aux = node;
while (F[node] > 0)
node = F[node];
int root = node;
node = aux;
while (node != root) {
aux = F[node];
F[node] = root;
node = aux;
}
return root;
}
static inline void join(int node1, int node2) {
int root1 = get_root(node1);
int root2 = get_root(node2);
if (root1 == root2) return;
if (F[root1] <= F[root2]) {
F[root1] += F[root2];
F[root2] = root1;
} else {
F[root2] += F[root1];
F[root1] = root2;
}
}
static inline bool query(int node1, int node2) {
return get_root(node1) == get_root(node2);
}
int N, M, op, node1, node2, i;
int main() {
fin >> N >> M;
for (i = 1; i <= M; ++i) {
fin >> op >> node1 >> node2;
if (op == 1) join(node1, node2);
else {
if (query(node1, node2)) fout << "DA\n";
else fout << "NU\n";
}
}
fout.close();
return 0;
}