#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);++(i))
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);--(i))
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
using namespace std;
const int N=1000005;
int n,m,flag[N],L[N],R[N],Q[N],cnt,tot,val[N];
ll A[N],B[N];
struct node{
ll sum,a,b,st,len;
}t[N];
int gi(){
int a=0;char x=getchar();
while(x<'0'||x>'9')x=getchar();
while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+(x^48),x=getchar();
return a;
}
il bool cmp(int a,int b){return a<b;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll calc(ll a,ll b,ll n){
ll x=a/b;a%=b;
ll sum=n(n+1)/2x;
if(!a||!b) return sum;
ll lala=n/b,m=an/b;
return sum+nm-calc(b,a,m)+lala;
}
il ll solve(ll a,ll b,ll n){
if(n<1)return 0;
ll g=gcd(a,b);
return n(n+1)/2a-bcalc(a/g,b/g,n);
}
il void pushup(int rt){t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;}
il void gai(ll A,ll B,ll st,int rt){
t[rt].a=A,t[rt].b=B,t[rt].st=st;
t[rt].sum=solve(A,B,st+t[rt].len-1)-solve(A,B,st-1);
}
il void pushdown(int rt){
if(t[rt].b){
gai(t[rt].a,t[rt].b,t[rt].st,rt<<1);
gai(t[rt].a,t[rt].b,t[rt].st+t[rt<<1].len,rt<<1|1);
t[rt].b=0;
}
}
void build(int l,int r,int rt){
if(l+1==r){t[rt]=node{0,0,0,0,val[r]-val[l]};return;}
int m=l+r>>1;
t[rt]=node{0,0,0,0,val[r]-val[l]};
build(lson),build(rson);
}
void update(ll A,ll B,int L,int R,int l,int r,int rt){
if(R<=l||r<=L)return;
if(L<=l&&R>=r){gai(A,B,val[l]-val[L]+1,rt);return;}
pushdown(rt);
int m=l+r>>1;
if(L<=m) update(A,B,L,R,lson);
if(R>=m) update(A,B,L,R,rson);
pushup(rt);
}
ll query(int L,int R,int l,int r,int rt){
if(R<=l||r<=L)return 0;
if(L<=l&&R>=r)return t[rt].sum;
pushdown(rt);
int m=l+r>>1;
ll ret=0;
if(L<=m) ret+=query(L,R,lson);
if(R>=m) ret+=query(L,R,rson);
return ret;
}
int main(){
n=gi(),m=gi();
For(i,1,m) {
flag[i]=gi(),L[i]=gi()-1,R[i]=gi(),Q[++tot]=&L[i],Q[++tot]=&R[i];
if(flag[i]==1) A[i]=gi(),B[i]=gi();
}
sort(Q+1,Q+tot+1,cmp);
int lst=-1;
For(i,1,tot) if(*Q[i]!=lst) lst=*Q[i],*Q[i]=++cnt,val[cnt]=lst;else *Q[i]=cnt;
build(1,cnt,1);
For(i,1,m)
if(flag[i]==1) update(A[i],B[i],L[i],R[i],1,cnt,1);
else printf("%lld\n",query(L[i],R[i],1,cnt,1));
return 0;
}