#include <bits/stdc++.h>
#define rep(i,x,y) for (int i = (x); i<=(y); i++)
#define repe(i,x,y) for (int i = (x); i < (y);i++)
#define drep(i,x,y) for (int i = (x); i >= (y); i--)
#define mp make_pair
#define pb push_back
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAXN 60000
#define sf(n) scanf("%Lf",&n)
#define prf(n) printf("%Lf",n)
#define	s(n) scanf("%d",&n)
#define sl(n) scanf("%lld",&n)
#define pr(n) printf("%d",n)
#define prl(n) printf("%lld",n)
#define endc printf("\n")
#define psp printf(" ")

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef struct report {
	int many, color; bool all;
} report;

report newreport(int many,int color,bool all) {
	report x = *new report(); x.many = many; x.color = color; x.all = all;
	return x;
}

int n,m;
int lft[8*MAXN];
int ln[8*MAXN];
int rn[8*MAXN];
int rgt[8*MAXN];
int sz[8*MAXN];
bool lazy[8*MAXN];

void dev(int x) {
	lft[x] = lft[x*2]; ln[x] = ln[x*2];
	if (rn[x*2] == ln[x*2] && ln[x*2] == ln[x*2 + 1]) { lft[x] += lft[x*2 + 1]; }
	rgt[x] = rgt[x*2 + 1]; rn[x] = rn[x*2 + 1];
	if (ln[x*2 + 1] == rn[x*2 + 1] && rn[x*2] == rn[x*2 + 1]) { rgt[x] += rgt[x*2]; }
}

void push(int x,int l,int r) { // means x is monochrome
	if (!lazy[x]) return;
	lazy[x*2] = true; lazy[x*2 + 1] = true; lazy[x] = false;
	int color = ln[x]; int mid = (l+r)/2;
	ln[x*2] = rn[x*2] = ln[x*2 + 1] = rn[x*2 + 1] = color;
	lft[x*2] = rgt[x*2] = sz[x*2]; lft[x*2 + 1] = rgt[x*2 + 1] = sz[x*2 + 1];
}

void init(int x,int l,int r) {
	lazy[x] = false; sz[x] = r-l+1;
	if (l == r) { lft[x] = 1; rgt[x] = 1; ln[x] = 0; rn[x] = 0; return; }
	int mid = (l+r)/2;
	init(x*2,l,mid); init(x*2 + 1,mid+1,r);
	dev(x);
}

void update(int x,int l,int r,int i,int j,int c) {
	push(x,l,r);
	if (j < l || r < i) return;
	if (i <= l && r <= j) { 
		ln[x] = rn[x] = c; lft[x] = rgt[x] = r-l+1; lazy[x] = true; return; 
	}
	int mid = (l+r)/2;
	update(x*2,l,mid,i,j,c); update(x*2 + 1,mid+1,r,i,j,c);
	dev(x);
}

report leftquery(int x,int l,int r,int p) {
	push(x,l,r);
	if (l == r) { return newreport(1,ln[x],true); }
	int mid = (l+r)/2;
	if (p <= mid) {
		return leftquery(x*2,l,mid,p);
	} else {
		report ans = leftquery(x*2 + 1,mid+1,r,p);
		if (ans.all && rn[x*2] == ans.color) {
			ans.many += rgt[x*2];
			ans.all = false;
			if (rgt[x*2] == sz[x*2]) ans.all = true;
		} else {
			ans.all = false;
		}
		return ans;
	}
}

report rightquery(int x,int l,int r,int p) {
	push(x,l,r);
	if (l == r) { return newreport(1,rn[x],true); }
	int mid = (l+r)/2;
	if (p > mid) {
		return rightquery(x*2 + 1,mid+1,r,p);
	} else {
		report ans = rightquery(x*2,l,mid,p);
		if (ans.all && ln[x*2 + 1] == ans.color) {
			ans.many += lft[x*2 + 1];
			ans.all = false;
			if (lft[x*2 + 1] == sz[x*2 + 1]) ans.all = true;
		} else {
			ans.all = false;
		}
		return ans;
	}
}

int gv(int x,int l,int r,int p) {
	push(x,l,r);
	if (l == r) return ln[x];
	int mid = (l+r)/2;
	if (p <= mid) return gv(x*2,l,mid,p);
	return gv(x*2 + 1,mid+1,r,p);
}

int main() {
	s(n); s(m);
	init(1,1,n);
	while (m--) {
		int type; s(type);
		if (type == 1) {
			int a,b,c; s(a); s(b); s(c);
			update(1,1,n,a,b,c);
		} else {
			int p; s(p);
			int col = gv(1,1,n,p);
			int lf = p - leftquery(1,1,n,p).many + 1;
			int rg = p + rightquery(1,1,n,p).many - 1;
			printf("%d %d %d\n",col,lf,rg);
		}
	}

	return 0;

}