#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=100005;
const ll MOD=1000000007;
ll sum1[4MAX], sum2[4MAX], sum3[4MAX], lazyv[4MAX];
ll A[MAX];
ll getMod(ll x){
ll res=x%MOD;
if(res<0) res+=MOD;
return res;
}
void build(int node, int l, int r){
if(lr){
ll val = getMod(A[l]);
sum1[node]=val;
sum2[node]=(valval)%MOD;
sum3[node]=(valval%MODval)%MOD;
return;
}
int mid=(l+r)/2;
build(node2,l,mid);
build(node2+1,mid+1,r);
sum1[node]=(sum1[node2]+sum1[node2+1])%MOD;
sum2[node]=(sum2[node2]+sum2[node2+1])%MOD;
sum3[node]=(sum3[node2]+sum3[node2+1])%MOD;
}
void push_down(int node, int l, int r){
if(lazyv[node]==0) return;
ll K=lazyv[node];
int mid=(l+r)/2, left=node2, right=node2+1, cnt1=mid-l+1, cnt2=r-mid;
// Left child
ll s1=sum1[left], s2=sum2[left];
ll K2=(KK)%MOD, K3=(K2K)%MOD;
sum1[left]=(sum1[left]+Kcnt1)%MOD;
sum2[left]=(sum2[left]+(2Ks1)%MOD + (K2cnt1)%MOD)%MOD;
sum3[left]=(sum3[left]+(3Ks2)%MOD + (3K2s1)%MOD + (K3cnt1)%MOD)%MOD;
lazyv[left]=(lazyv[left]+K)%MOD;
// Right child
ll s1r=sum1[right], s2r=sum2[right];
sum1[right]=(sum1[right]+Kcnt2)%MOD;
sum2[right]=(sum2[right]+(2Ks1r)%MOD + (K2cnt2)%MOD)%MOD;
sum3[right]=(sum3[right]+(3Ks2r)%MOD + (3K2s1r)%MOD + (K3cnt2)%MOD)%MOD;
lazyv[right]=(lazyv[right]+K)%MOD;
lazyv[node]=0;
}
void update(int node, int l, int r, int L, int R, ll K){
if(R<l||r<L) return;
if(L<=l && r<=R){
ll cnt=r-l+1;
ll s1=sum1[node], s2=sum2[node];
ll K2=(KK)%MOD, K3=(K2K)%MOD;
sum1[node]=(sum1[node]+Kcnt)%MOD;
sum2[node]=(sum2[node]+(2Ks1)%MOD + (K2cnt)%MOD)%MOD;
sum3[node]=(sum3[node]+(3Ks2)%MOD + (3K2s1)%MOD + (K3cnt)%MOD)%MOD;
lazyv[node]=(lazyv[node]+K)%MOD;
return;
}
push_down(node,l,r);
int mid=(l+r)/2;
update(node2,l,mid,L,R,K);
update(node2+1,mid+1,r,L,R,K);
sum1[node]=(sum1[node2]+sum1[node2+1])%MOD;
sum2[node]=(sum2[node2]+sum2[node2+1])%MOD;
sum3[node]=(sum3[node2]+sum3[node2+1])%MOD;
}
ll query(int node, int l, int r, int L, int R){
if(R<l||r<L) return 0;
if(L<=l && r<=R) return sum3[node];
push_down(node,l,r);
int mid=(l+r)/2;
return (query(node2,l,mid,L,R)+query(node2+1,mid+1,r,L,R))%MOD;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N,M; cin>>N>>M;
for(int i=1;i<=N;i++) cin>>A[i];
build(1,1,N);
while(M--){
int type; cin>>type;
if(type1){
int L,R; ll K; cin>>L>>R>>K;
K=getMod(K);
update(1,1,N,L,R,K);
}
else{
int L,R; cin>>L>>R;
ll ans=query(1,1,N,L,R);
ans=getMod(ans);
cout<<ans<<"\n";
}
}
return 0;
}