template<class Info, class Merge = plus<Info>>struct SegTree{ int n; Merge merge; vector<Info> info; SegTree(int n): n(n), merge(Merge()), info(4 * n) {} SegTree(int n, vector<Info> &init): SegTree(n) { function<void(int,int,int)> build = [&](int p, int l, int r) { if(l == r) { info[p] = init[l]; return; } int m = (l + r) / 2; build(2 * p, l, m); build(2 * p + 1, m + 1, r); pull(p); }; build(1, 0, n - 1); } void pull(int p) { info[p] = move(merge(info[2 * p], info[2 * p + 1])); } void modify(int p, int l, int r, int x, const Info &v) { if(l == r) { info[p] = v; return; } int m = (l + r) / 2; if(x <= m) modify(p * 2, l, m, x, v); else modify(2 * p + 1, m + 1, r, x, v); pull(p); } void modify(int p, const Info &v) { modify(1, 0, n - 1, p, v); } Info rangeQuery(int p, int l, int r, int x, int y) { if(l > y || r < x) { return Info(); } if(l >= x && r <= y) return info[p]; int m = (l + r) / 2; return merge(rangeQuery(p * 2, l, m, x, y), rangeQuery(p * 2 + 1, m + 1, r, x, y)); } Info rangeQuery(int l, int r) { return rangeQuery(1, 0, n - 1, l, r); }};struct Info { int L, R; Info() { L = 0, R = 0; } Info(int L, int R): L(L), R(R){}};struct Merge { Info operator () (const Info &l, const Info &r) const { Info t; t.L = l.L + r.L - min(l.L, r.R); t.R = l.R + r.R - min(l.L, r.R); return t; }};
template<class Info, class LazyTag, class Merge, class Mapping, class Composition>struct LazySegTree{ int n; Merge merge; Mapping mapping; Composition composition; vector<Info> info; vector<LazyTag> lazyTag; LazySegTree(int n): n(n), merge(Merge()), mapping(Mapping()), composition(Composition()), info(4 * n), lazyTag(4 * n) {} LazySegTree(int n, vector<Info> &init): LazySegTree(n) { function<void(int,int,int)> build = [&](int p, int l, int r) { if(l == r) { info[p] = init[l]; return; } int m = (l + r) / 2; build(2 * p, l, m); build(2 * p + 1, m + 1, r); pull(p); }; build(1, 0, n - 1); } void pull(int p) { info[p] = move(merge(info[2 * p], info[2 * p + 1])); } void push(int p, const LazyTag& tag) { mapping(tag, info[p]); composition(tag, lazyTag[p]); } void pushdown(int p) { push(2 * p, lazyTag[p]); push(2 * p + 1, lazyTag[p]); lazyTag[p] = LazyTag(); } // 这里是 LazyTag void modify(int p, int l, int r, int L, int R, const LazyTag &v) { if(l >= L && r <= R) { push(p, v); return; } pushdown(p); int m = (l + r) / 2; if(L <= m) modify(p * 2, l, m, L, R, v); if(R > m) modify(2 * p + 1, m + 1, r, L, R, v); pull(p); } void modify(int l, int r, const LazyTag &v) { modify(1, 0, n - 1, l, r, v); } Info rangeQuery(int p, int l, int r, int x, int y) { if(l > y || r < x) { return Info(); } if(l >= x && r <= y) return info[p]; int m = (l + r) / 2; pushdown(p); return merge(rangeQuery(p * 2, l, m, x, y), rangeQuery(p * 2 + 1, m + 1, r, x, y)); } Info rangeQuery(int l, int r) { return rangeQuery(1, 0, n - 1, l, r); }};struct Info { ll sum; Info(ll sum = 0):sum(sum) {}};struct LazyTag { ll val; LazyTag(ll val = -1):val(val){}};struct Merge { Info operator () (const Info &l, const Info &r) const { Info t; t.sum = (l.sum + r.sum); return t; }};struct Mapping { void operator () (const LazyTag& tag, Info& info) const { if(tag.val != -1) { info.sum = tag.val; } }};struct Composition { void operator ()(const LazyTag& x, LazyTag& y) const { if(x.val != -1) { y.val = x.val; } }};void solve() { int n, m; cin >> n >> m; vector<Info> init(n); LazySegTree<Info, LazyTag, Merge, Mapping, Composition> seg(n, init); while(m --){ int op; cin >> op; if(op == 1) { int l, r, v; cin >> l >> r >> v; seg.modify(l, r - 1, LazyTag(v)); } else { int l, r; cin >> l; cout << seg.rangeQuery(l, l).sum << endl; } }}