#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define reg register int
using namespace std;
const int MAXN = 2e5 + 24,MOD = 1e9 + 7;
int n,m,x,y,z,l,r,len,num,opt;
int a[MAXN],st[MAXN],ed[MAXN],bel[MAXN],sum[505],pref[505][505];
inline void init()
{
len = 505,num = (n / len);
if(n % len) num ++;
for(reg i = 1;i <= num;i++)
{
st[i] = (i - 1) * len + 1;
ed[i] = min(n,i * len);
}
for(reg i = 1;i <= n;i ++)
{
cin >> a[i];
bel[i] = (i - 1) / len + 1;
sum[bel[i]] += a[i];
}
}
inline void modify(int x,int y,int z)
{
if(x >= num)
{
for(reg i = y;i <= n;i += x)
{
a[i] += z;
sum[bel[i]] += z;
}
return ;
}
for(reg i = y;i <= x;i++)
pref[x][i] += z;
}
inline int query(int l,int r)
{
int res = 0;
int bl = bel[l],br = bel[r];
if(bl == br)
{
for(reg i = l;i <= r;i++)
res += a[i];
}
else
{
for(reg i = l;i <= ed[bl];i++)
res += a[i];
for(reg i = st[br];i <= r;i++)
res += a[i];
for(reg i = bl + 1;i <= br - 1;i++)
res += sum[i];
}
for(reg i = 1;i <= num;i++)
res += pref[i][r % i] - pref[i][(l - 1) % i] + pref[i][i] * ((r / i) - ((l - 1) / i));
return res % MOD;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> m;
init();
while(m--)
{
cin >> opt;
if(opt == 1)
{
cin >> x >> y >> z;
modify(x,y,z);
}
else
{
cin >> l >> r;
cout << query(l,r) % MOD << endl;
}
}
return 0;
}