#include<iostream>
#include<fstream>
#include<cmath>
#define in cin
#define out cout
using namespace std;
const int Nmax = 50001;
int A[Nmax],V[Nmax];
int B[Nmax];
int N,n,M;
void refr(int ind){
    int has=V[n*ind];
    for(int i=n*ind;i<n*(ind+1);i++){
        if(V[i]!=has){
            B[ind]=-1;
            return;
        }
    }
    B[ind]=has;
}
void lazy(int ind){
    if(B[ind]!=-1) for(int i=n*ind;i<n*(ind+1);i++) V[i]=B[ind];
    B[ind]=-1;
}
void Update(int x,int y,int val){
    if(A[x]==A[y]){
        lazy(A[x]);
        for(int i=x;i<=y;i++) V[i]=val;
        refr(A[x]);
        return;
    }
    lazy(A[x]);
    lazy(A[y]);
    for(int i=x;A[i]==A[x];i++) V[i]=val;
    for(int i=y;A[i]==A[y];i--) V[i]=val;
    for(int i=A[x]+1;i<=A[y]-1;i++) B[i]=val;
    refr(A[x]);
    refr(A[y]);
}
int Val(int a){
    return ( B[A[a]]==-1 ? V[a] : B[A[a]] );
}
int Right(int x,int val){
    int i;
    for(i=x;A[i]==A[x];i++) if(val!=Val(i)) return i-1;
    for(i=A[x]+1;B[i]==val;i++);
    for(i=n*i;val==Val(i);i++);
    return i-1;
}
int Left(int x,int val){
    int i;
    for(i=x;A[i]==A[x];i--) if(val!=Val(i)) return i+1;
    for(i=A[x]-1;B[i]==val;i--);
    for(i=n*(i+1);val==Val(i);i--);
    return i+1;
}
void Query(int a){
    out<<Val(a)<<' ';
    out<<Left(a,Val(a))<<' ';
    out<<Right(a,Val(a))<<' ';
    out<<'\n';
}
int main(){
    #ifndef ONLINE_JUDGE
    ifstream in("test.in");
    ofstream out("test.out");
    #endif
    in>>N>>M;
    n=sqrt(N);
    for(int i=0;i<=N+1;i++) A[i]=i/n;
    V[0]=V[N+1]=-1;
    B[A[0]]=B[A[N+1]]=-1;
    for(;M;--M){
        int t,x,y,z;
        in>>t;
        if(t==1){
            in>>x>>y>>z;
            Update(x,y,z);

        }
        if(t==2){
            in>>x;
            Query(x);
        }
    }
    return 0;
}