#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 1e5 + 5, MOD=1e9+7;
long long n,q,a[MaxN];
struct Segtree_lazy
{
vector<long long> st,lazy_x,lazy_y;
void init(long long n)
{
if(n==0)
{
return;
}
st.assign(4*n+1,0);
lazy_x.assign(4*n+1,0);
lazy_y.assign(4*n+1,0);
}
void build(long long id, long long l, long long r)
{
if(l==r)
{
st[id]=a[l]%MOD;
return;
}
long long mid=(l+r)>>1;
build(2*id,l,mid);
build(2*id+1,mid+1,r);
st[id]=(st[2*id]+st[2*id+1])%MOD;
}
long long cnt(long long x, long long y)
{
return y-x+1;
}
long long sum(long long x, long long y)
{
return ((x+y)%MOD*cnt(x,y)%MOD*500000004)%MOD;
}
void push_down(long long id, long long l, long long r)
{
if(l==r) return;
long long mid=(l+r)>>1;
long long x=lazy_x[id];
long long y=lazy_y[id];
lazy_x[2*id]=(lazy_x[2*id]+x)%MOD;
lazy_y[2*id]=(lazy_y[2*id]+y)%MOD;
st[2*id]=(st[2*id]+y*cnt(l,mid)%MOD
+x*sum(0,mid-l)%MOD)%MOD;
lazy_x[2*id+1]=(lazy_x[2*id+1]+x)%MOD;
lazy_y[2*id+1]=(lazy_y[2*id+1]+y+x*(mid+1-l)%MOD)%MOD;
st[2*id+1]=(st[2*id+1]+y*cnt(mid+1,r)%MOD
+x*sum(mid+1-l,r-l)%MOD)%MOD;
lazy_x[id]=0;
lazy_y[id]=0;
}
void update(long long id,long long l, long long r, long long u, long long v, long long x, long long y)
{
if(l>v||r<u)
{
return;
}
if(u<=l&&r<=v)
{
long long val=(y+x*(l-u)%MOD)%MOD;
st[id]=(st[id]+val*cnt(l,r)%MOD
+x*sum(0,r-l)%MOD)%MOD;
lazy_x[id]=(lazy_x[id]+x)%MOD;
lazy_y[id]=(lazy_y[id]+val)%MOD;
return;
}
long long mid=(l+r)>>1;
push_down(id,l,r);
update(2*id,l,mid,u,v,x,y);
update(2*id+1,mid+1,r,u,v,x,y);
st[id]=(st[2*id]+st[2*id+1])%MOD;
}
long long get(long long id, long long l, long long r, long long u, long long v)
{
if(l>v||r<u)
{
return 0;
}
if(u<=l&&r<=v)
{
return st[id];
}
long long mid=(l+r)>>1;
push_down(id,l,r);
return (get(2*id,l,mid,u,v)
+get(2*id+1,mid+1,r,u,v))%MOD;
}
void update(long long u, long long v, long long x, long long y)
{
update(1,1,n,u,v,x,y);
}
long long get(long long u, long long v)
{
return get(1,1,n,u,v);
}
};
Segtree_lazy segtree;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
segtree.init(n);
for(long long i=1; i<=q; i++)
{
long long type,l,r;
cin>>type>>l>>r;
if(type==1)
{
long long x,y;
cin>>x>>y;
segtree.update(l,r,x,y);
}
else
{
cout<<segtree.get(l,r)%MOD<<"\n";
}
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgbG9uZyBsb25nIE1heE4gPSAxZTUgKyA1LCBNT0Q9MWU5Kzc7CmxvbmcgbG9uZyBuLHEsYVtNYXhOXTsKc3RydWN0IFNlZ3RyZWVfbGF6eQp7CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBzdCxsYXp5X3gsbGF6eV95OwogICAgdm9pZCBpbml0KGxvbmcgbG9uZyBuKQogICAgewogICAgICAgIGlmKG49PTApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHN0LmFzc2lnbig0Km4rMSwwKTsKICAgICAgICBsYXp5X3guYXNzaWduKDQqbisxLDApOwogICAgICAgIGxhenlfeS5hc3NpZ24oNCpuKzEsMCk7CiAgICB9CiAgICB2b2lkIGJ1aWxkKGxvbmcgbG9uZyBpZCwgbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByKQogICAgewogICAgICAgIGlmKGw9PXIpCiAgICAgICAgewogICAgICAgICAgICBzdFtpZF09YVtsXSVNT0Q7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbG9uZyBsb25nIG1pZD0obCtyKT4+MTsKICAgICAgICBidWlsZCgyKmlkLGwsbWlkKTsKICAgICAgICBidWlsZCgyKmlkKzEsbWlkKzEscik7CiAgICAgICAgc3RbaWRdPShzdFsyKmlkXStzdFsyKmlkKzFdKSVNT0Q7CiAgICB9CiAgICBsb25nIGxvbmcgY250KGxvbmcgbG9uZyB4LCBsb25nIGxvbmcgeSkKICAgIHsKICAgICAgICByZXR1cm4geS14KzE7CiAgICB9CiAgICBsb25nIGxvbmcgc3VtKGxvbmcgbG9uZyB4LCBsb25nIGxvbmcgeSkKICAgIHsKICAgICAgICByZXR1cm4gKCh4K3kpJU1PRCpjbnQoeCx5KSVNT0QqNTAwMDAwMDA0KSVNT0Q7CiAgICB9CiAgICB2b2lkIHB1c2hfZG93bihsb25nIGxvbmcgaWQsIGxvbmcgbG9uZyBsLCBsb25nIGxvbmcgcikKICAgIHsKICAgICAgICBpZihsPT1yKSByZXR1cm47CgogICAgICAgIGxvbmcgbG9uZyBtaWQ9KGwrcik+PjE7CiAgICAgICAgbG9uZyBsb25nIHg9bGF6eV94W2lkXTsKICAgICAgICBsb25nIGxvbmcgeT1sYXp5X3lbaWRdOwoKICAgICAgICBsYXp5X3hbMippZF09KGxhenlfeFsyKmlkXSt4KSVNT0Q7CiAgICAgICAgbGF6eV95WzIqaWRdPShsYXp5X3lbMippZF0reSklTU9EOwogICAgICAgIHN0WzIqaWRdPShzdFsyKmlkXSt5KmNudChsLG1pZCklTU9ECiAgICAgICAgICAgICAgICAgICt4KnN1bSgwLG1pZC1sKSVNT0QpJU1PRDsKCiAgICAgICAgbGF6eV94WzIqaWQrMV09KGxhenlfeFsyKmlkKzFdK3gpJU1PRDsKICAgICAgICBsYXp5X3lbMippZCsxXT0obGF6eV95WzIqaWQrMV0reSt4KihtaWQrMS1sKSVNT0QpJU1PRDsKICAgICAgICBzdFsyKmlkKzFdPShzdFsyKmlkKzFdK3kqY250KG1pZCsxLHIpJU1PRAogICAgICAgICAgICAgICAgICAgICt4KnN1bShtaWQrMS1sLHItbCklTU9EKSVNT0Q7CgogICAgICAgIGxhenlfeFtpZF09MDsKICAgICAgICBsYXp5X3lbaWRdPTA7CiAgICB9CiAgICB2b2lkIHVwZGF0ZShsb25nIGxvbmcgaWQsbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByLCBsb25nIGxvbmcgdSwgbG9uZyBsb25nIHYsIGxvbmcgbG9uZyB4LCBsb25nIGxvbmcgeSkKICAgIHsKICAgICAgICBpZihsPnZ8fHI8dSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYodTw9bCYmcjw9dikKICAgICAgICB7CiAgICAgICAgICAgIGxvbmcgbG9uZyB2YWw9KHkreCoobC11KSVNT0QpJU1PRDsKCiAgICAgICAgICAgIHN0W2lkXT0oc3RbaWRdK3ZhbCpjbnQobCxyKSVNT0QKICAgICAgICAgICAgICAgICAgICAreCpzdW0oMCxyLWwpJU1PRCklTU9EOwoKICAgICAgICAgICAgbGF6eV94W2lkXT0obGF6eV94W2lkXSt4KSVNT0Q7CiAgICAgICAgICAgIGxhenlfeVtpZF09KGxhenlfeVtpZF0rdmFsKSVNT0Q7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbG9uZyBsb25nIG1pZD0obCtyKT4+MTsKICAgICAgICBwdXNoX2Rvd24oaWQsbCxyKTsKICAgICAgICB1cGRhdGUoMippZCxsLG1pZCx1LHYseCx5KTsKICAgICAgICB1cGRhdGUoMippZCsxLG1pZCsxLHIsdSx2LHgseSk7CiAgICAgICAgc3RbaWRdPShzdFsyKmlkXStzdFsyKmlkKzFdKSVNT0Q7CiAgICB9CiAgICBsb25nIGxvbmcgZ2V0KGxvbmcgbG9uZyBpZCwgbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByLCBsb25nIGxvbmcgdSwgbG9uZyBsb25nIHYpCiAgICB7CiAgICAgICAgaWYobD52fHxyPHUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYodTw9bCYmcjw9dikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzdFtpZF07CiAgICAgICAgfQogICAgICAgIGxvbmcgbG9uZyBtaWQ9KGwrcik+PjE7CiAgICAgICAgcHVzaF9kb3duKGlkLGwscik7CiAgICAgICAgcmV0dXJuIChnZXQoMippZCxsLG1pZCx1LHYpCiAgICAgICAgICAgICAgICArZ2V0KDIqaWQrMSxtaWQrMSxyLHUsdikpJU1PRDsKICAgIH0KICAgIHZvaWQgdXBkYXRlKGxvbmcgbG9uZyB1LCBsb25nIGxvbmcgdiwgbG9uZyBsb25nIHgsIGxvbmcgbG9uZyB5KQogICAgewogICAgICAgIHVwZGF0ZSgxLDEsbix1LHYseCx5KTsKICAgIH0KICAgIGxvbmcgbG9uZyBnZXQobG9uZyBsb25nIHUsIGxvbmcgbG9uZyB2KQogICAgewogICAgICAgIHJldHVybiBnZXQoMSwxLG4sdSx2KTsKICAgIH0KfTsKU2VndHJlZV9sYXp5IHNlZ3RyZWU7CgppbnQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwoKICAgIGNpbj4+bj4+cTsKICAgIHNlZ3RyZWUuaW5pdChuKTsKCiAgICBmb3IobG9uZyBsb25nIGk9MTsgaTw9cTsgaSsrKQogICAgewogICAgICAgIGxvbmcgbG9uZyB0eXBlLGwscjsKICAgICAgICBjaW4+PnR5cGU+Pmw+PnI7CiAgICAgICAgaWYodHlwZT09MSkKICAgICAgICB7CiAgICAgICAgICAgIGxvbmcgbG9uZyB4LHk7CiAgICAgICAgICAgIGNpbj4+eD4+eTsKICAgICAgICAgICAgc2VndHJlZS51cGRhdGUobCxyLHgseSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQ8PHNlZ3RyZWUuZ2V0KGwsciklTU9EPDwiXG4iOwogICAgICAgIH0KICAgIH0KfQo=