#include using namespace std; typedef long long ll; ll n,m,o,l,r,x,y,a[200009]; pair tmp[200009]; struct st{ll l,r; mutable ll v; bool operator < (const st &a) const{return l < a.l;}}; set s; inline ll read(){ ll s = 0,w = 1; char ch = getchar(); while (ch > '9' || ch < '0'){ if (ch == '-') w = -1; ch = getchar();} while (ch <= '9' && ch >= '0') s = (s << 1) + (s << 3) + (ch ^ 48),ch = getchar(); return s * w; } ll qp(ll x,ll y,ll mod){ ll a = 1,b = x % mod; while (y){ if (y & 1) a = a * b % mod; b = b * b % mod,y >>= 1; } return a; } set :: iterator split(ll pos){ set :: iterator it = s.lower_bound((st){pos,pos,0}); if (it != s.end() && it -> l == pos) return it; it --; if (it -> r < pos) return s.end(); st now = *it; s.erase(it),s.insert((st){now.l,pos - 1,now.v}); return s.insert((st){pos,now.r,now.v}).first; } void assign(ll l,ll r,ll v){ set :: iterator itr = split(r + 1),itl = split(l); s.erase(itl,itr),s.insert((st){l,r,v}); set :: iterator it = s.lower_bound((st){l,l,0}); set :: iterator it2 = s.upper_bound((st){l,l,0}); if (it2 != s.end()){ if (it2 -> v == it -> v){ st qwq = (st){it -> l,it2 -> r,it -> v}; s.erase(it),s.erase(it2); s.insert(qwq); } } it = s.lower_bound((st){l,l,0}); if (it != s.begin()){ set :: iterator it2 = (-- s.lower_bound((st){l,l,0})); if (it2 -> v == it -> v){ st qwq = (st){it2 -> l,it -> r,it -> v}; s.erase(it),s.erase(it2); s.insert(qwq); } } } void query(ll x,ll y){ if (x > y) swap(x,y); if (x == y){puts("1"); return;} if (!s.size()){puts("0"); return;} set :: iterator it = -- s.upper_bound((st){x,x,0}); if (it -> v == 0 || (it -> v == 1 && it -> r < y - 1)) puts("0"); else puts("1"); } void query2(ll x){ if (!s.size()){puts("1"); return;} set :: iterator it = -- s.upper_bound((st){x,x,0}); ll ans = 1; if (it -> v == 1) ans += it -> r - it -> l + 1; else if (it != s.begin()){ it --; if (it -> r == x - 1 && it -> v == 1) ans += it -> r - it -> l + 1; } printf("%lld\n",ans); } int main(){ n = read(),m = read(); s.insert((st){1,n - 1,0}); while (m --){ o = read(); if (o == 1) l = read(),r = read(),assign(l,r - 1,1); if (o == 2) l = read(),r = read(),assign(l,r - 1,0); if (o == 3) x = read(),y = read(),query(x,y); if (o == 4) x = read(),query2(x); } return 0; }