#include using namespace std; using ll = long long; const int iinf = 1e9; const ll inf = 1e18; template ostream& operator<<(ostream &o, vector v) { for (int i = 0; i < v.size(); i++) o << v[i] << (i+1 struct SegTree { using F = function; int n; F f; T ti; vector dat; SegTree() {} SegTree(F f, T ti,int num) : f(f), ti(ti) { n = max(__bit_ceil(num), 1); dat.assign(n << 1, ti); } SegTree(F f,T ti,vector&v):SegTree(f,ti,v.size()){ for (int i = 0; i < v.size(); i++) dat[n + i] = v[i]; for(int i=n-1;i;i--) dat[i]=f(dat[i*2], dat[i*2+1]); } void set_val(int k, T x) { dat[k += n] = x; while(k >>= 1) dat[k] = f(dat[k*2], dat[k*2+1]); } T query(int a, int b) { if (a >= b) return ti; T vl = ti, vr = ti; for (int l=a+n, r=b+n; l>=1, r>>=1) { if (l & 1) vl = f(vl, dat[l++]); if (r & 1) vr = f(dat[--r], vr); } return f(vl, vr); } }; struct Edge { int to; ll cost; }; int main() { cin.tie(0)->sync_with_stdio(false); int N, Q; cin >> N >> Q; SegTree segL([&](ll a, ll b) { return min(a, b); }, inf, N); SegTree segR([&](ll a, ll b) { return min(a, b); }, inf, N); while(Q--){ int type, x; cin >> type >> x; x--; if(type == 1){ ll ans = x; ll t1 = segL.query(0, x) + x; ll t2 = segR.query(x, N) - x; ans = min({ans, t1, t2}); cout << ans << "\n"; } else { ll c; cin >> c; segL.set_val(x, min(segL.query(x,x+1), c - x)); segR.set_val(x, min(segL.query(x,x+1), c + x)); } } return 0; }