#include 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]; } int suma_interval(int x, int y) { int s = 0; for ( int i = x; i <= y; ++i ) s += getPoint(i); return s; } void query(int x) { int st = 0, dr = 0; int id, 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; } for ( int i = x; i >= 1; --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; }