#include using namespace std; using int64 = long long; const int64 INF = (1LL<<60); struct SegMin { int n; vector seg; SegMin(int N): n(1) { while (n < N) n <<= 1; seg.assign(2*n, INF); } // 現在値と比較して小さければ更新(min で保持) void chmin(int idx, int64 val) { idx += n; if (val >= seg[idx]) return; seg[idx] = val; for (idx >>= 1; idx; idx >>= 1) seg[idx] = min(seg[idx<<1], seg[idx<<1|1]); } // [l,r](0-index, 両端含む)の最小値 int64 range_min(int l, int r) const { if (l > r) return INF; l += n; r += n; int64 res = INF; while (l <= r) { if (l & 1) res = min(res, seg[l++]); if (!(r & 1)) res = min(res, seg[r--]); l >>= 1; r >>= 1; } return res; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; if (!(cin >> N >> Q)) return 0; SegMin leftSeg(N), rightSeg(N); vector bestCost(N, INF); // マス毎の最安テレポートコスト while (Q--) { int type; cin >> type; if (type == 1) { int x; cin >> x; // 1‑based --x; // 0‑basedに int64 ans = x; // 歩くだけ ⇒ cost = x‑(0) = x int64 lm = leftSeg.range_min(0, x); if (lm < INF) ans = min(ans, lm + (int64)(x+1)); // +1 は元の 1‑based int64 rm = rightSeg.range_min(x, N-1); if (rm < INF) ans = min(ans, rm - (int64)(x+1)); cout << ans << '\n'; } else { int a; int64 c; cin >> a >> c; // 1‑based --a; if (c < bestCost[a]) { bestCost[a] = c; leftSeg.chmin(a, c - (a+1)); // (c - a) rightSeg.chmin(a, c + (a+1)); // (c + a) } } } return 0; }