#include <bits/stdc++.h>

using namespace std;

const int BS = 1 << 16;
char buffer[BS];
int position = BS;

inline char Getchar()
{
    if ( position == BS )
    {
        position = 0;
        fread( buffer, BS, 1, stdin );
    }

    return buffer[ position++ ];
}

inline int readNr()
{
    register int a = 0;
    char ch;

    do
    {
        ch = Getchar();

    } while ( !isdigit(ch) );

    do
    {
        a = ( a << 3 ) + ( a << 1 ) + ch - '0';
        ch = Getchar();

    } while ( isdigit(ch) );

    return a;
}

const int Nmax = 50000 + 1;
const int DIM = 220;

struct Bucket
{
    int st, dr;
    int suma;
    int lazy;
};

Bucket B[Nmax];

int v[Nmax];
int N, M, nrB;

void update(int x, int y, int val)
{
    for ( int i = 1; i <= nrB; ++i )
    {
        if ( x <= B[i].st && B[i].dr <= y ) /// contine grupa
        {
            B[i].lazy = val;
            B[i].suma = val * DIM;

            continue;
        }

        if ( B[i].st <= x && y <= B[i].dr ) /// contine intervalul
        {
            if ( B[i].lazy != -1 )
            {
                for ( int j = B[i].st; j < x; ++j )
                    v[j] = B[i].lazy;

                for ( int j = y + 1; j <= B[i].dr; ++j )
                    v[j] = B[i].lazy;

                B[i].lazy = -1;
            }

            for ( int j = x; j <= y; ++j )
                v[j] = val;

            B[i].suma = 0;

            for ( int j = B[i].st; j <= B[i].dr; ++j )
                B[i].suma += v[j];

            continue;
        }

        if ( B[i].st <= x && x <= B[i].dr )
        {
            if ( B[i].lazy != -1 )
            {
                for ( int j = B[i].st; j < x; ++j )
                    v[j] = B[i].lazy;

                B[i].lazy = -1;
            }

            for ( int j = x; j <= B[i].dr; ++j )
                v[j] = val;

            B[i].suma = 0;

            for ( int j = B[i].st; j <= B[i].dr; ++j )
                B[i].suma += v[j];

            continue;
        }

        if ( B[i].st <= y && y <= B[i].dr )
        {
            if ( B[i].lazy != -1 )
            {
                for ( int j = y + 1; j <= B[i].dr; ++j )
                    v[j] = B[i].lazy;

                B[i].lazy = -1;
            }

            for ( int j = B[i].st; j <= y; ++j )
                v[j] = val;

            B[i].suma = 0;

            for ( int j = B[i].st; j <= B[i].dr; ++j )
                B[i].suma += v[j];

            continue;
        }
    }
}

int getPoint(int x)
{
    int gr = x / DIM;
    if ( x % DIM ) gr++;

    assert( B[gr].st <= x && x <= B[gr].dr );

    if ( B[gr].lazy != -1 )
        return B[gr].lazy;
    else
        return v[x];
}

void query(int x)
{
    int st = 0, dr = 0;
    int id, val = getPoint(x);

    for ( int i = 1; i <= nrB; ++i )
    {
        if ( B[i].st <= x && x <= B[i].dr )
            id = i;
    }

    int stopSt = 0;

    for ( int i = x; i >= B[id].st; --i )
    {
        if ( getPoint(i) != val )
        {
            stopSt = 1;
            break;
        }

        st = i;
    }

    int stopDr = 0;

    for ( int i = x; i <= N; ++i )
    {
        if ( getPoint(i) != val )
        {
            stopDr = 1;
            break;
        }

        dr = i;
    }

    if ( stopSt == 0 )
    {
        int stId = 0;

        for ( int i = id - 1; i >= 1; i-- )
        {
            if ( val == 0 && B[i].suma == DIM ) break;
            if ( val == 1 && B[i].suma == 0 ) break;
            stId = i;
        }

        if ( stId > 0 )
        {
            for ( int i = B[stId].dr; i >= B[stId].st; --i )
            {
                if ( getPoint(i) != val ) break;
                st = i;
            }
        }
    }

    printf("%d %d %d\n", val, st, dr);
}

int main()
{
    ///freopen("data.in", "r", stdin);

    N = readNr(); M = readNr();

    int i = 1, j = min( N, i + DIM - 1 );

    B[ ++nrB ] = { i, j, 0, -1 };

    while ( j < N )
    {
        i = j + 1;
        j = min( N, i + DIM - 1 );

        B[ ++nrB ] = { i, j, 0, -1 };
    }

    while ( M-- )
    {
        int tip, a, b, c;

        tip = readNr();

        if ( tip == 1 )
        {
            a = readNr(); b = readNr(); c = readNr();
            update(a, b, c);
        }
        else
        {
            a = readNr();
            query(a);
        }
    }

    return 0;
}