#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;

int n,m;
pair<int,int> queries[100011];
int qL=0;
vector< pair< pair<int,int>,int > > wanted[100011];
int answers[100011];

int father[100011];

int Find(int ver)
{
    if (father[ver]==0)
    return ver;
    else
    {
        father[ver]=Find(father[ver]);
        return father[ver];
    }
}

int main()
{
    int i,j;
    int cm;
    int x,y;
    int counter=0;
    int L=0;
    int r1,r2;

    scanf("%d %d",&n,&m);

    for (i=1;i<=m;i++)
    {
        scanf("%d",&cm);

        if (cm==1)
        {
            scanf("%d %d",&x,&y);

            qL++;
            queries[qL]=make_pair(x,y);

            counter++;
        }
        else if (cm==2)
        {
            scanf("%d",&x);

            counter-=x;
        }
        else
        {
            scanf("%d %d",&x,&y);

            L++;
            wanted[counter].push_back( make_pair( make_pair(x,y),L ) );
        }
    }

    for (i=0;i<wanted[0].size();i++)
    {
        if ( wanted[0][i].first.first==wanted[0][i].first.second )
        answers[ wanted[0][i].second ]=1;
        else
        answers[ wanted[0][i].second ]=0;
    }

    for (i=1;i<=qL;i++)
    {
        r1=Find(queries[i].first);
        r2=Find(queries[i].second);

        if (r1!=r2)
        {
            father[r1]=r2;
        }

        for (j=0;j<wanted[i].size();j++)
        {
            r1=Find( wanted[i][j].first.first );
            r2=Find( wanted[i][j].first.second );

            if (r1==r2)
            answers[ wanted[i][j].second ]=1;
            else
            answers[ wanted[i][j].second ]=0;
        }
    }

    for (i=1;i<=L;i++)
    {
        printf("%d\n",answers[i]);
    }

    return 0;
}