P3367 【模板】并查集 123456789101112131415161718192021222324252627282930313233343536373839404142434445#include<cstdio>#define re registerconst int MAXn = 1e4;template <class T> inline void read(T &a) { register char c;while (c = getchar(), c < '0' || c >'9');register T x(c - '0');while (c = getchar(), c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);}a = x; }int fa[MAXn + 10];int anc(int x) { return fa[x] = fa[x] == x ? x : anc(fa[x]);}void Merge(int x, int y) { if (anc(x) != anc(y)) { fa[anc(x)] = y; }}bool SameAnc(int x, int y) { return anc(x) == anc(y);}void Init(int top) { for (re int i = 1; i <= top; ++i) { fa[i] = i; }}int n, m;int main() { read(n), read(m); Init(n); for (re int i = 1, opt, x, y; i <= m; ++i) { read(opt); switch (opt) { case 1: read(x), read(y); Merge(x, y); break; case 2: read(x), read(y); SameAnc(x, y) ? printf("Y\n") : printf("N\n"); break; } }}