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

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);
    cin.tie(NULL);
    int n,m;
    cin >>n>>m;
    vector<int> v(n);
    for(int i=0;i<n;i++)
    {
        v[i]=i;
    }
    int x;
    cin >>x;
    int c,d;
    cin >>c>>d;
    char h;
    cin >>h;
    bool nj;
    vector<char> drugi(n,'@');
    if(h!='a')
    {
        drugi[c]==h;
        nj=false;
    }
    else
    {
        nj=true;
        c--;
        d--;
        napravi_vezu(v,c,d);
    }
    for(int i=1;i<m;i++)
    {
        int k;
        cin >>k;
        if(nj)
        {
        if(k==1)
        {
            int a,b;
            cin >>a>>b;
            a--;
            b--;
            char c;
            cin >>c;
            napravi_vezu(v,a,b);
        }
        else
        {
            int a,b;
            cin >>a>>b;
            a--;
            b--;
            if(cale(v,a)==cale(v,b))
            {
                cout <<1<<"\n";
            }
            else
            {
                cout <<0<<"\n";
            }
        }
        }
        else
        {
            if(k==1)
            {
                int a,b;
                cin >>a>>b;
                a--;
                b--;
                char c;
                cin >>c;
                drugi[b]=c;
            }
            else
            {
                int a,b;
                cin >>a>>b;
                a--;
                b--;
                if(b<a)
                {
                    swap(a,b);
                }
                bool bet=true;
                string pom="";
                for(int i=a+1;i<b+1;i++)
                {
                    pom+=drugi[i];
                    if(drugi[i]=='@')
                    {
                        bet=false;
                        break;
                    }
                }
                for(int i=0;i<pom.size()/2;i++)
                {
                    if(pom[i]!=pom[pom.size()-1-i])
                       {
                           bet=false;
                           break;
                        }
                }
                cout <<bet<<"\n";
            }
        }
    }


    return 0;
}