Disjoint set

#include <bits/stdc++.h>

using namespace std;
#define WBUF_SIZE (1 << 20)

char rbuf[WBUF_SIZE];
int ridx, nidx;

inline char read() 
{
    if (ridx == nidx) 
    {
        nidx = fread(rbuf, 1, 1 << 20, stdin);
        if (!nidx) return 0;
        ridx = 0;
    }
    return rbuf[ridx++];
}

inline int readInt() 
{
    int sum = 0;
    char now = read();
    bool flg = false;

    while (now <= 32) now = read();
    if (now == '-') flg = true, now = read();
    while (now >= 48) sum = sum * 10 + now - '0', now = read();

    return flg ? -sum : sum;
}

int arr[1000001][2]={1};

int find(int F);
void merge(int A, int B);

int main()
{
    int N,M,A,B,C;

    N = readInt();
    M = readInt();

    for(int i=0; i<N+1; i++)
        arr[i][0]=i;

    for(int i=0; i<M; i++)
    {
        A = readInt();
        B = readInt();
        C = readInt();

        if(A==1)
            if(find(B)==find(C))
                printf("YES\n");
            else
                printf("NO\n");
        else if(A==0)
            merge(B,C);
    }
}

int find(int F)
{
    if(arr[F][0]!=F)
        arr[F][0]=find(arr[F][0]);

    return arr[F][0];
}

void merge(int A, int B)
{
    if(find(A)!=find(B))
        if(arr[A][1]>arr[B][1])
        {
            arr[find(B)][1]+=arr[find(A)][1];
            arr[find(A)][0]=find(B);
        }
        else
        {
            arr[find(A)][1]+=arr[find(B)][1];
            arr[find(A)][0]=find(B);
        }
}

객체끼리의 연결성을 구하는 것인데, 해당 객체의 최상위 객체의 주소를 가져야함

만일 한 객체에 대해 같은 최상위 객체를 가진다면 연결된 것으로 본다

연결은 최상위 객체 번호를 바꾸는 것으로 한다.