#include<bits/stdc++.h>
using namespace std;
using ll = long long int;
#define MOD (ll) (1e9+7)
ll lazy[1000000];
void buildTree(ll *tree,ll ind,ll s,ll e)
{
if(s>e)
return;
if(s==e)
{
tree[ind] = 0;
return;
}
ll mid = (s+e)/2;
buildTree(tree,2*ind,s,mid);
buildTree(tree,2*ind+1,mid+1,e);
tree[ind] = 0;
return;
}
ll power(ll a,ll p,ll m = MOD)
{
ll res=1;
while(p>0){
if(p&1)
res=(res*a)%m;
a=(a*a)%m;
p>>=1;
}
return res;
}
void lazy_update(ll *t,ll ss,ll se,ll node)
{
if(lazy[node]!=-1)
{
t[node] = (power(2,(se-ss+1),MOD)-1)*lazy[node];
if(ss!=se)
{
lazy[2*node]=lazy[node];
lazy[2*node+1]=lazy[node];
}
lazy[node] = -1;
}
}
void update_range(ll *t,ll ss,ll se,ll l,ll r,ll val,ll node)
{
lazy_update(t,ss,se,node);
if(ss>r || se<l)
{
return;
}
if(ss>=l && se<=r)
{
t[node] = (power(2,(se-ss+1),MOD)-1)*val;
if(ss!=se)
{
lazy[node*2]=val;
lazy[node*2+1]=val;
}
return;
}
ll mid=ss+se>>1;
update_range(t,ss,mid,l,r,val,node*2);
update_range(t,mid+1,se,l,r,val,node*2+1);
t[node]=(t[node*2]*power(2,se-mid,MOD)%MOD+t[node*2+1])%MOD;
}
ll query(ll *t,ll ss,ll se,ll l,ll r,ll node)
{
lazy_update(t,ss,se,node);
if(ss>r || se<l)
{
return 0;
}
if(ss>=l && se<=r)
{
return t[node];
}
ll mid= (ss+se)/2;
ll p1 = query(t,ss,mid,l,r,(2*node));
ll p2 = query(t,mid+1,se,l,r,(2*node)+1);
return (p1* power(2,min(se,r)-mid,MOD)%MOD+p2)%MOD;
}
int main()
{
ll n,m;
cin>>n>>m;
ll t[4*n+2];
for(int i=0;i<1000000;i++)
{
lazy[i] = -1;
}
buildTree(t,1,0,n-1);
while(m--)
{
int x,l,r;
cin>>x>>l>>r;
if(x == 0 || x==1 )
{
update_range(t,0,n-1,l,r,x,1);
}
else
{
ll ans=query(t,0,n-1,l,r,1);
cout<<ans<<endl;
}
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbGwgPSBsb25nIGxvbmcgaW50OwojZGVmaW5lIE1PRCAobGwpICgxZTkrNykKCmxsIGxhenlbMTAwMDAwMF07CnZvaWQgYnVpbGRUcmVlKGxsICp0cmVlLGxsIGluZCxsbCBzLGxsIGUpCnsKCWlmKHM+ZSkKCQlyZXR1cm47CglpZihzPT1lKQoJewoJCXRyZWVbaW5kXSA9IDA7CgkJcmV0dXJuOwoJfQoKCWxsIG1pZCA9IChzK2UpLzI7CglidWlsZFRyZWUodHJlZSwyKmluZCxzLG1pZCk7CglidWlsZFRyZWUodHJlZSwyKmluZCsxLG1pZCsxLGUpOwoKCXRyZWVbaW5kXSA9IDA7CglyZXR1cm47CgkKfQoKCmxsIHBvd2VyKGxsIGEsbGwgcCxsbCBtID0gTU9EKQp7CglsbCByZXM9MTsKCXdoaWxlKHA+MCl7CgkJaWYocCYxKQoJCQlyZXM9KHJlcyphKSVtOwoJCWE9KGEqYSklbTsKCQlwPj49MTsKCX0KCXJldHVybiByZXM7Cn0KCnZvaWQgbGF6eV91cGRhdGUobGwgKnQsbGwgc3MsbGwgc2UsbGwgbm9kZSkKewoJaWYobGF6eVtub2RlXSE9LTEpCgl7CgkJdFtub2RlXSA9IChwb3dlcigyLChzZS1zcysxKSxNT0QpLTEpKmxhenlbbm9kZV07CgkJaWYoc3MhPXNlKQoJCXsKCQkJbGF6eVsyKm5vZGVdPWxhenlbbm9kZV07CgkJCWxhenlbMipub2RlKzFdPWxhenlbbm9kZV07CgkJfQoJCWxhenlbbm9kZV0gPSAtMTsKCX0KCQp9Cgp2b2lkIHVwZGF0ZV9yYW5nZShsbCAqdCxsbCBzcyxsbCBzZSxsbCBsLGxsIHIsbGwgdmFsLGxsIG5vZGUpCnsKCSAgIGxhenlfdXBkYXRlKHQsc3Msc2Usbm9kZSk7CgkgICBpZihzcz5yIHx8IHNlPGwpCgkgICB7CgkgICAgIHJldHVybjsKCSAgIH0KCSAgIGlmKHNzPj1sICYmIHNlPD1yKQoJICAgewoJICAgICAgIAl0W25vZGVdID0gKHBvd2VyKDIsKHNlLXNzKzEpLE1PRCktMSkqdmFsOwoJICAgICAgIAlpZihzcyE9c2UpCiAgICAgICAgewogICAgICAgICAgICBsYXp5W25vZGUqMl09dmFsOwogICAgICAgICAgICBsYXp5W25vZGUqMisxXT12YWw7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKCSAgIH0KCSAgIGxsIG1pZD1zcytzZT4+MTsKICAgIHVwZGF0ZV9yYW5nZSh0LHNzLG1pZCxsLHIsdmFsLG5vZGUqMik7CiAgICB1cGRhdGVfcmFuZ2UodCxtaWQrMSxzZSxsLHIsdmFsLG5vZGUqMisxKTsKICAgIHRbbm9kZV09KHRbbm9kZSoyXSpwb3dlcigyLHNlLW1pZCxNT0QpJU1PRCt0W25vZGUqMisxXSklTU9EOwp9CgpsbCBxdWVyeShsbCAqdCxsbCBzcyxsbCBzZSxsbCBsLGxsIHIsbGwgbm9kZSkKewogICAgbGF6eV91cGRhdGUodCxzcyxzZSxub2RlKTsKCSAgIGlmKHNzPnIgfHwgc2U8bCkKCSAgIHsKCSAgICAgcmV0dXJuIDA7CgkgICB9CgkgICBpZihzcz49bCAmJiBzZTw9cikKCSAgIHsKCSAgICAgICByZXR1cm4gdFtub2RlXTsKCSAgIH0KCSAgIGxsIG1pZD0gKHNzK3NlKS8yOwogICAgbGwgcDEgPSBxdWVyeSh0LHNzLG1pZCxsLHIsKDIqbm9kZSkpOwogICAgbGwgcDIgPSBxdWVyeSh0LG1pZCsxLHNlLGwsciwoMipub2RlKSsxKTsKICAgIHJldHVybiAocDEqIHBvd2VyKDIsbWluKHNlLHIpLW1pZCxNT0QpJU1PRCtwMiklTU9EOwp9CgppbnQgbWFpbigpCnsKICAgbGwgbixtOwogICBjaW4+Pm4+Pm07CiAgIGxsIHRbNCpuKzJdOwogICBmb3IoaW50IGk9MDtpPDEwMDAwMDA7aSsrKQogICB7CiAgICAgIGxhenlbaV0gPSAtMTsKICAgfQogICBidWlsZFRyZWUodCwxLDAsbi0xKTsKICAgd2hpbGUobS0tKQogICB7CiAgICAgICAgaW50IHgsbCxyOwogICAgICAgIGNpbj4+eD4+bD4+cjsKICAgICAgICBpZih4ID09IDAgfHwgeD09MSApCiAgICAgICAgewogICAgICAgICAgICB1cGRhdGVfcmFuZ2UodCwwLG4tMSxsLHIseCwxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbGwgYW5zPXF1ZXJ5KHQsMCxuLTEsbCxyLDEpOwogICAgICAgICAgICBjb3V0PDxhbnM8PGVuZGw7CiAgICAgICAgfQogICAgfQp9