// #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include using namespace std; using ll = long long; using ull = unsigned long long; template using pq = priority_queue; template using qp = priority_queue, greater>; #define vec(T, A, ...) vector A(__VA_ARGS__); #define vvec(T, A, h, ...) vector> A(h, vector(__VA_ARGS__)); #define vvvec(T, A, h1, h2, ...) vector>> A(h1, vector>(h2, vector(__VA_ARGS__))); #ifndef RIN__LOCAL #define endl "\n" #endif #define spa ' ' #define len(A) A.size() #define all(A) begin(A), end(A) #define fori1(a) for(ll _ = 0; _ < (a); _++) #define fori2(i, a) for(ll i = 0; i < (a); i++) #define fori3(i, a, b) for(ll i = (a); i < (b); i++) #define fori4(i, a, b, c) for(ll i = (a); ((c) > 0 || i > (b)) && ((c) < 0 || i < (b)); i += (c)) #define overload4(a, b, c, d, e, ...) e #define fori(...) overload4(__VA_ARGS__, fori4, fori3, fori2, fori1)(__VA_ARGS__) template vector> ENUMERATE(vector &A, ll s = 0){ vector> ret(A.size()); for(int i = 0; i < A.size(); i++) ret[i] = {i + s, A[i]}; return ret; } vector> ENUMERATE(string &A, ll s = 0){ vector> ret(A.size()); for(int i = 0; i < A.size(); i++) ret[i] = {i + s, A[i]}; return ret; } #define enum1(A) fori(A.size()) #define enum2(a, A) for(auto a:A) #define enum3(i, a, A) for(auto&& [i, a]: ENUMERATE(A)) #define enum4(i, a, A, s) for(auto&& [i, a]: ENUMERATE(A, s)) #define enum(...) overload4(__VA_ARGS__, enum4, enum3, enum2, enum1)(__VA_ARGS__) template vector> ZIP(vector &A, vector &B){ int n = min(A.size(), B.size()); vector> ret(n); for(int i = 0; i < n; i++) ret[i] = {A[i], B[i]}; return ret; } template vector> ENUMZIP(vector &A, vector &B, ll s = 0){ int n = min(A.size(), B.size()); vector> ret(n); for(int i = 0; i < n; i++) ret[i] = {i + s, A[i], B[i]}; return ret; } #define zip4(a, b, A, B) for(auto&& [a, b]: ZIP(A, B)) #define enumzip5(i, a, b, A, B) for(auto&& [i, a, b]: ENUMZIP(A, B)) #define enumzip6(i, a, b, A, B, s) for(auto&& [i, a, b]: ENUMZIP(A, B, s)) #define overload6(a, b, c, d, e, f, g, ...) g #define zip(...) overload6(__VA_ARGS__, enumzip6, enumzip5, zip4, _, _, _)(__VA_ARGS__) vector stoc(string &S){ int n = S.size(); vector ret(n); for(int i = 0; i < n; i++) ret[i] = S[i]; return ret; } #define INT(...) int __VA_ARGS__; inp(__VA_ARGS__); #define LL(...) ll __VA_ARGS__; inp(__VA_ARGS__); #define STRING(...) string __VA_ARGS__; inp(__VA_ARGS__); #define CHAR(...) char __VA_ARGS__; inp(__VA_ARGS__); #define VEC(T, A, n) vector A(n); inp(A); #define VVEC(T, A, n, m) vector> A(n, vector(m)); inp(A); const ll MOD1 = 1000000007; const ll MOD9 = 998244353; template auto min(const T& a){ return *min_element(all(a)); } template auto max(const T& a){ return *max_element(all(a)); } template auto clamp(T &a, const S &l, const S &r) { return (a > r ? r : a < l ? l : a); } template inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); } template inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); } template inline bool chclamp(T &a, const S &l, const S &r) { auto b = clamp(a, l, r); return (a != b ? a = b, 1 : 0); } void FLUSH(){cout << flush;} void print(){cout << endl;} template void print(Head &&head, Tail &&... tail) { cout << head; if (sizeof...(Tail)) cout << spa; print(forward(tail)...); } template void print(vector &A){ int n = A.size(); for(int i = 0; i < n; i++){ cout << A[i]; if(i != n - 1) cout << ' '; } cout << endl; } template void print(vector> &A){ for(auto &row: A) print(row); } template void print(pair &A){ cout << A.first << spa << A.second << endl; } template void print(vector> &A){ for(auto &row: A) print(row); } template void prisep(vector &A, S sep){ int n = A.size(); for(int i = 0; i < n; i++){ cout << A[i]; if(i == n - 1) cout << endl; else cout << sep; } } template void priend(T A, S end){ cout << A << end; } template void priend(T A){ priend(A, spa); } template void inp(T&... a){ (cin >> ... >> a); } template void inp(vector &A){ for(auto &a:A) cin >> a; } template void inp(vector> &A){ for(auto &row:A) inp(row); } template void inp(pair &A){ inp(A.first, A.second); } template void inp(vector> &A){ for(auto &row: A) inp(row.first, row.second); } template T sum(vector &A){ T tot = 0; for(auto a:A) tot += a; return tot; } template vector compression(vector X){ sort(all(X)); X.erase(unique(all(X)), X.end()); return X; } vector> read_edges(int n, int m, bool direct=false, int indexed=1){ vector> edges(n, vector()); for(int i = 0; i < m; i++){ INT(u, v); u -= indexed; v -= indexed; edges[u].push_back(v); if(!direct) edges[v].push_back(u); } return edges; } vector> read_tree(int n, int indexed=1){ return read_edges(n, n - 1, false, indexed); } template vector>> read_wedges(int n, int m, bool direct=false, int indexed=1){ vector>> edges(n, vector>()); for(int i = 0; i < m; i++){ INT(u, v); T w; inp(w); u -= indexed; v -= indexed; edges[u].push_back({v, w}); if(!direct) edges[v].push_back({u, w}); } return edges; } template vector>> read_wtree(int n, int indexed=1){ return read_wedges(n, n - 1, false, indexed); } struct UnionFind{ int n; vector par; vector ma; int group; UnionFind() = default; UnionFind(int n) : n(n){ par.assign(n, -1); ma.resize(n); iota(all(ma), 0); group = n; } int find(int x){ if(par[x] < 0) return x; par[x] = find(par[x]); return par[x]; } bool unite(int x, int y){ x = find(x); y = find(y); if(x == y) return false; if(par[x] > par[y]) swap(x, y); group--; par[x] += par[y]; par[y] = x; chmax(ma[x], ma[y]); return true; } bool same(int x, int y){ return find(x) == find(y); } int size(int x){ return -par[find(x)]; } vector roots(){ vector ret; for(int i = 0; i < n; i++){ if(i == find(i)) ret.push_back(i); } return ret; } }; #include "atcoder/lazysegtree.hpp" struct S{ ll len; ll tot; }; S op(S l, S r){ return {l.len + r.len, l.tot + r.tot}; } S e(){ return {0, 0}; } using F = ll; S mapping(F f, S x){ return (f == -1) ? x : S{x.len, x.len * f}; } F composition(F l, F r){ if(l == -1) return r; else return l; } F id(){ return -1; } void solve(){ INT(n, Q); vec(int, typ, Q); vec(ll, L, Q); vec(ll, R, Q); vec(ll, X, 0); fori(i, Q){ inp(typ[i], L[i]); if(typ[i] != 4) inp(R[i]); X.push_back(L[i]); X.push_back(R[i]); } X = compression(X); int le = len(X); vec(S, ini, le - 1); fori(i, le - 1) ini[i] = {X[i + 1] - X[i], X[i + 1] - X[i]}; atcoder::lazy_segtree seg(ini); fori(i, Q){ int t = typ[i]; if(t == 1){ ll l = L[i]; ll r = R[i]; l = lower_bound(all(X), l) - X.begin(); r = lower_bound(all(X), r) - X.begin(); seg.apply(l, r, 0); } else if(t == 2){ ll l = L[i]; ll r = R[i]; l = lower_bound(all(X), l) - X.begin(); r = lower_bound(all(X), r) - X.begin(); seg.apply(l, r, 1); } else if(t == 3){ ll l = L[i]; ll r = R[i]; l = lower_bound(all(X), l) - X.begin(); r = lower_bound(all(X), r) - X.begin(); if(l > r) swap(l, r); auto res = seg.prod(l, r); if(res.tot == 0) print(1); else print(0); } else{ int v = L[i]; v = lower_bound(all(X), v) - X.begin(); int l = seg.min_left(v, [](S x){ return x.tot == 0; }); int r = seg.max_right(v, [](S x){ return x.tot == 0; }); print(X[r] - X[l] + 1); } // fori(i, n - 1) priend(seg.get(i).tot, " "); // print(); } } int main(){ cin.tie(0)->sync_with_stdio(0); // cout << fixed << setprecision(12); int t; t = 1; // cin >> t; while(t--) solve(); return 0; }