#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct upit
{
    int k;
    int a,b;
    char c;
};

int cale(vector<int>& v,int a)
{
    while(a!=v[a])
    {
        a=v[v[a]];
    }
    return a;
}


void napravi_vezu(vector<int>& v,int a,int b)
{

    int ca=cale(v,a);
    int cb=cale(v,b);
    if(ca<cb)
    {
        v[cb]=ca;
    }
    else
    {
        v[ca]=cb;
    }

}
int main()
{
    ios_base::sync_with_stdio(false);

    int n,m;
    cin >>n>>m;
    vector<int> v(n);
    for(int i=0;i<n;i++)
    {
        v[i]=i;
    }
    vector<char> drugi(n+2,'@');
    bool nj=true;
    vector<upit> upiti(m);
    for(int i=0;i<m;i++)
    {
        cin >>upiti[i].k;
        if(upiti[i].k==1)
        {
            cin >>upiti[i].a>>upiti[i].b>>upiti[i].c;
            if(upiti[i].c!='a')
            {
                nj=false;
            }
        }
        else
        {
            cin >>upiti[i].a>>upiti[i].b;
        }

    }
    for(int i=0;i<m;i++)
    {
        int k;
        k=upiti[i].k;
        if(nj)
        {
        if(k==1)
        {
            int a,b;
            a=upiti[i].a;
            b=upiti[i].b;
            a--;
            b--;
            char c;
            c=upiti[i].c;
            napravi_vezu(v,a,b);
        }
        else
        {
            int a,b;
            a=upiti[i].a;
            b=upiti[i].b;
            a--;
            b--;
            if(cale(v,a)==cale(v,b))
            {
                cout <<1<<"\n";
            }
            else
            {
                cout <<0<<"\n";
            }
        }
        }
        else
        {

            if(k==1)
            {
                int a,b;
                a=upiti[i].a;
                b=upiti[i].b;
                a--;
                b--;
                if(b<a)
                {
                    swap(a,b);
                }
                char c;
                c=upiti[i].c;
                drugi[b]=c;
            }
            else
            {

                int a,b;
                a=upiti[i].a;
                b=upiti[i].b;
                a--;
                b--;
                if(b<a)
                {
                    swap(a,b);
                }
                bool bet=true;
                string pom="";
                for(int j=a+1;j<b+1;j++)
                {
                    pom+=drugi[j];
                    if(drugi[j]=='@')
                    {
                        bet=false;
                        break;
                    }
                }
                string pom2=pom;
                reverse(pom2.begin(),pom2.end());
                if(pom!=pom2)
                {
                    bet=false;
                }
                cout <<bet<<"\n";
            }
        }
    }

    return 0;
}