#include #define NMAX 65536 int sum[2 * NMAX], li[2 * NMAX], ls[2 * NMAX], u[2 * NMAX][2]; int N, M, op, x, y; void InitSegTree() { int i, lson, rson; for (i = NMAX; i < 2 * NMAX; i++) { li[i] = ls[i] = i - NMAX + 1; sum[i] = u[i][0] = u[i][1] = 0; } for (i = NMAX - 1; i >= 1; i--) { lson = i << 1; rson = lson + 1; li[i] = li[lson]; ls[i] = ls[rson]; sum[i] = u[i][0] = u[i][1] = 0; } } int QA, QB, QU, QT, QOP; void IntervalOp(int node, int qupush, int qtpush) { int lson, rson; lson = node << 1; rson = lson + 1; if (u[node][1] > 0 && li[node] < ls[node]) { u[lson][0] = u[rson][0] = u[node][0]; u[lson][1] = u[rson][1] = u[node][1]; sum[lson] = (ls[lson] - li[lson] + 1) * u[node][0]; sum[rson] = (ls[rson] - li[rson] + 1) * u[node][0]; u[node][1] = 0; } if (QA <= li[node] && ls[node] <= QB) { if (QOP == 1) { u[node][0] = QU; u[node][1] = QT; sum[node] = (ls[node] - li[node] + 1) * QU; } else { QU += sum[node]; } //fprintf(stderr, "* QT=%d node=%d: %d-%d %d\n", QT, node, li[node], ls[node], sum[node]); return; } if (QA <= ls[lson]) IntervalOp(lson, qupush, qtpush); if (QB >= li[rson]) IntervalOp(rson, qupush, qtpush); sum[node] = sum[lson] + sum[rson]; //if (li[node] == 1 && ls[node] == 4) // fprintf(stderr, "+ QT=%d: sum=%d\n", QT, sum[node]); } int Query(int poz) { int ans = 0, t = 0; poz = NMAX + poz - 1; while (poz >= 1) { if (u[poz][1] > t) { ans = u[poz][0]; t = u[poz][1]; } poz >>= 1; } return ans; } int FindPredecessor(int x, int y) { int li = 1, ls = x, ans = x, mid; while (li <= ls) { mid = (li + ls) >> 1; QA = mid; QB = x; QU = 0; IntervalOp(1, 0, 0); if (QU == y * (x - mid + 1)) { ans = mid; ls = mid - 1; } else li = mid + 1; } return ans; } int FindSuccessor(int x, int y) { int li = x, ls = N, ans = x, mid; while (li <= ls) { mid = (li + ls) >> 1; QA = x; QB = mid; QU = 0; IntervalOp(1, 0, 0); if (QU == y * (mid - x + 1)) { ans = mid; li = mid + 1; } else ls = mid - 1; } return ans; } int main() { InitSegTree(); scanf("%d %d", &N, &M); for (QT = 1; QT <= M; QT++) { //fprintf(stderr, "--%d\n", QT); scanf("%d", &QOP); if (QOP == 1) { scanf("%d %d %d", &QA, &QB, &QU); IntervalOp(1, 0, 0); } else { scanf("%d", &x); y = Query(x); printf("%d %d %d\n", y, FindPredecessor(x, y), FindSuccessor(x, y)); } } return 0; }