#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define MAXN 50050 int N, M, Q, t, a, b, c; int S[MAXN]; int Supd[MAXN]; int A[MAXN]; void updateSlot(int idx) { if(Supd[idx] != -1) { for(int i = idx * M; i < idx * M + M; i++) A[i] = Supd[idx]; Supd[idx] = -1; } } void update(int a, int b, int c) { int i; int aIdx = a / M; updateSlot(aIdx); for(i = a; i <= b && i % M; i++) { int d = c - A[i]; S[i / M] += d; A[i] = c; } for(; i + M <= b; i += M) { S[i / M] = c * M; Supd[i / M] = c; } int bIdx = b / M; updateSlot(bIdx); for(i = bIdx * M; i <= b; i++) { int d = c - A[i]; S[i / M] += d; A[i] = c; } } pair query(int a) { int y = a; int z = a; int aIdx = a / M; int i; updateSlot(aIdx); int val = A[a]; for(i = a; (i + 1) % M != 0 && A[i] == val; i--); if(i >= 0 && (i + 1) % M == 0) { for(; i >= 0; i -= M) { int need = val * M; if(S[i / M] != need) { updateSlot(i / M); while(A[i] == val) i--; break; } } } y = i + 1; for(i = a; i < N && i % M != 0 && A[i] == val; i++); if(i < N && i % M == 0) { for(; i + M < N; i += M) { int need = val * M; if(S[i / M] != need) { updateSlot(i / M); while(A[i] == val) i++; break; } } if(i + M >= N) { updateSlot(i / M); while(i < N && A[i] == val) i++; } } z = i - 1; return make_pair(y, z); } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); scanf("%d %d", &N, &Q); M = 1; while((M + 1) * (M + 1) <= N) M++; fill(Supd, Supd + N, -1); for(int i = 0; i < Q; i++) { scanf("%d %d", &t, &a); a--; if(t == 1) { scanf("%d %d", &b, &c); b--; update(a, b, c); } else { pair q = query(a); printf("%d %d %d\n", A[a], q.first + 1, q.second + 1); } } return 0; }