#include<bits/stdc++.h>
#define ls (u<<1)
#define rs ((u<<1)|1)
#define mid ((tr[u].l+tr[u].r)>>1)
using namespace std;
const int N=2e5+10;
int n,m;
struct Info{
int l,r,tag,len;
int sum,pre,suf,ms;
}tr[N<<2];
void pushup(int u){
auto &T=tr[u],L=tr[ls],R=tr[rs];
T.sum=L.sum+R.sum;
T.pre=(L.sum? L.pre:L.len+R.pre);
T.suf=(R.sum? R.suf:R.len+L.suf);
T.ms=max(max(L.ms,R.ms),L.suf+R.pre);
}
void update(int u,int k){
auto &T=tr[u];
if(!k){
T.ms=T.pre=T.suf=T.len;
T.tag=0; T.sum=0;
}
else{
T.ms=T.pre=T.suf=0;
T.sum=T.len; T.tag=1;
}
}
void pushdown(int u){
auto &T=tr[u];
if(~T.tag){
update(ls,T.tag); update(rs,T.tag);
T.tag=-1;
}
}
void build(int u,int l,int r){
tr[u]={l,r,-1,r-l+1,1,0,0,0};
if(l==r){
return;
}
build(ls,l,mid); build(rs,mid+1,r);
pushup(u);
}
void modify(int u,int l,int r,int k){
if(tr[u].l>=l and tr[u].r<=r){
update(u,k);
return;
}
pushdown(u);
if(l<=mid) modify(ls,l,r,k);
if(r>mid) modify(rs,l,r,k);
pushup(u);
}
int q1(int u,int l,int r){
if(tr[u].l>r or tr[u].r<l) return 0;
if(tr[u].l>=l and tr[u].r<=r){
return tr[u].sum;
}
pushdown(u);
return q1(ls,l,r)+q1(rs,l,r);
}
int q0(int u,int l,int r){
if(tr[u].l>r or tr[u].r<l) return 0;
if(tr[u].l>=l and tr[u].r<=r){
return tr[u].len-tr[u].sum;
}
pushdown(u);
return q0(ls,l,r)+q0(rs,l,r);
}
Info query(int u,int l,int r){
if(tr[u].l>=l and tr[u].r<=r){
return tr[u];
}
pushdown(u);
Info T,L,R;
if(l<=mid) L=query(ls,l,r);
if(r>mid) R=query(rs,l,r);
T.sum=L.sum+R.sum;
T.pre=(L.sum? L.pre:L.len+R.pre);
T.suf=(R.sum? R.suf:R.len+L.suf);
T.ms=max(max(L.ms,R.ms),L.suf+R.pre);
return T;
}
void work(){
int l0,r0,l1,r1;
scanf("%d%d%d%d",&l0,&r0,&l1,&r1);
int cnt=q1(1,l0,r0);
if(cnt==0) return;
modify(1,l0,r0,0);
int l=l1,r=r1;
while(l<r){
int M=(l+r)>>1;
if(q0(1,l1,M)<cnt) l=M+1;
else r=M;
}
modify(1,l1,l,1);
}
int main(){
scanf("%d%d",&n,&m);
build(1,1,n);
while(m--){
int op,l,r;
scanf("%d",&op);
if(op==0){
scanf("%d%d",&l,&r);
modify(1,l,r,0);
}
if(op==2){
scanf("%d%d",&l,&r);
printf("%d\n",query(1,l,r).ms);
}
if(op==1) work();
}
return 0;
}