#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, t, a, b, c; int Aint[4 * MAXN]; int Aupd[4 * MAXN]; void init(int k, int st, int dr) { if(st == dr) { Aupd[k] = -1; return; } int m = (st + dr) / 2; init(2 * k, st, m); init(2 * k + 1, m + 1, dr); } void update(int k, int st, int dr) { if(a <= st && dr <= b) { Aint[k] = c * (dr - st + 1); Aupd[k] = c; return; } int m = (st + dr) / 2; if(Aupd[k] != -1) { Aupd[2 * k] = Aupd[k]; Aupd[2 * k + 1] = Aupd[k]; Aint[2 * k] = Aupd[k] * (m - st + 1); Aint[2 * k + 1] = Aupd[k] * (dr - m); Aupd[k] = -1; } if(a <= m) update(2 * k, st, m); if(b > m) update(2 * k + 1, m + 1, dr); Aint[k] = Aint[2 * k] + Aint[2 * k + 1]; } int query(int k, int st, int dr, int pos) { if(st == dr) { return Aint[k]; } int m = (st + dr) / 2; if(Aupd[k] != -1) { Aupd[2 * k] = Aupd[k]; Aupd[2 * k + 1] = Aupd[k]; Aint[2 * k] = Aupd[k] * (m - st + 1); Aint[2 * k + 1] = Aupd[k] * (dr - m); Aupd[k] = -1; } int ret = -1; if(pos <= m) ret = query(2 * k, st, m, pos); else ret = query(2 * k + 1, m + 1, dr, pos); Aint[k] = Aint[2 * k] + Aint[2 * k + 1]; return ret; } int getMin(int k, int st, int dr, int L, int R, int val) { if(st == dr) { if(Aint[k] != val) return st; return 0; } int m = (st + dr) / 2; if(Aupd[k] != -1) { Aupd[2 * k] = Aupd[k]; Aupd[2 * k + 1] = Aupd[k]; Aint[2 * k] = Aupd[k] * (m - st + 1); Aint[2 * k + 1] = Aupd[k] * (dr - m); Aupd[k] = -1; } if(R > m) { int aux = Aint[2 * k + 1]; if(val == 0) { if(aux > 0) return getMin(2 * k + 1, m + 1, dr, L, R, val); } else { // val = 1 if(aux < (dr - m)) return getMin(2 * k + 1, m + 1, dr, L, R, val); } } if(L <= m) { int aux = Aint[2 * k]; if(val == 0) { if(aux > 0) return getMin(2 * k, st, m, L, R, val); } else { // val = 1 if(aux < (m - st + 1)) return getMin(2 * k, st, m, L, R, val); } } return 0; } int getMax(int k, int st, int dr, int L, int R, int val) { if(st == dr) { if(Aint[k] != val) return st; return N + 1; } int m = (st + dr) / 2; if(Aupd[k] != -1) { Aupd[2 * k] = Aupd[k]; Aupd[2 * k + 1] = Aupd[k]; Aint[2 * k] = Aupd[k] * (m - st + 1); Aint[2 * k + 1] = Aupd[k] * (dr - m); Aupd[k] = -1; } if(L <= m) { int aux = Aint[2 * k]; if(val == 0) { if(aux > 0) return getMax(2 * k, st, m, L, R, val); } else { // val = 1 if(aux < (m - st + 1)) return getMax(2 * k, st, m, L, R, val); } } if(R > m) { int aux = Aint[2 * k + 1]; if(val == 0) { if(aux > 0) return getMax(2 * k + 1, m + 1, dr, L, R, val); } else { // val = 1 if(aux < (dr - m)) return getMax(2 * k + 1, m + 1, dr, L, R, val); } } return N + 1; } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); scanf("%d %d", &N, &M); init(1, 1, N); for(int i = 0; i < M; i++) { scanf("%d %d", &t, &a); if(t == 1) { scanf("%d %d", &b, &c); update(1, 1, N); } else { int y = a; int q = query(1, 1, N, a); if(a > 1) y = getMin(1, 1, N, 1, a - 1, q) + 1; int z = a; if(a < N) z = getMax(1, 1, N, a + 1, N, q) - 1; printf("%d %d %d\n", q, y, z); } } return 0; }