#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_sum(int i)
{
    B[i].suma = 0;

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

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

        B[i].lazy = -1;
    }
}

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
        {
            update_lazy(i);

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

            update_sum(i);

            continue;
        }

        if ( B[i].st <= x && x <= B[i].dr )
        {
            update_lazy(i);

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

            update_sum(i);
            continue;
        }

        if ( B[i].st <= y && y <= B[i].dr )
        {
            update_lazy(i);

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

            update_sum(i);
            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];
}

int suma_interval(int x, int y)
{
    int s = 0;

    for ( int i = 1; i <= nrB; ++i )
    {
        if ( x <= B[i].st && B[i].dr <= y )
        {
            for ( int j = B[i].st; j <= B[i].dr; ++j )
                s += getPoint(j);

            continue;
        }

        if ( B[i].st <= x && y <= B[i].dr )
        {
            for ( int j = x; j <= y; ++j )
                s += getPoint(j);

            continue;
        }

        if ( B[i].st <= x && x <= B[i].dr )
        {
            for ( int j = x; j <= B[i].dr; ++j )
                s += getPoint(j);

            continue;
        }

        if ( B[i].st <= y && y <= B[i].dr )
        {
            for ( int j = B[i].st; j <= y; ++j )
                s += getPoint(j);

            continue;
        }
    }

    return s;
}

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

    int i = x, j = N;

    while ( i <= j )
    {
        int m = ( i + j ) / 2;

        int s = suma_interval( x, m );

        if ( s == val * (m - x + 1) )
        {
            dr = m;
            i = m + 1;
        }
        else
            j = m - 1;
    }

    i = 1, j = x;

    while ( i <= j )
    {
        int m = ( i + j ) / 2;

        int s = suma_interval( m, x );

        if ( s == val * (x - m + 1) )
        {
            st = m;
            j = m - 1;
        }
        else
            i = m + 1;
    }

    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;
}