卡的心态有点小崩。
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
//#define int long long
inline int read()
{
int x=0;
char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x;
}
int len;
const int N=2e5+3;
const int sqrtN=803;
int a[N];
long long tag[130][130];
long long tagb[sqrtN];
int bid[N],bl[sqrtN],br[sqrtN];
inline void add(int x,int dx)
{
tagb[bid[x]]+=dx;
tagb[bid[x]]%=mod;
a[x]+=dx;
a[x]%=mod;
}
inline long long query(int l,int r)
{
long long res=0;
if(bid[l]==bid[r])
{
for(int i=l;i<=r;i++)res=res+a[i];
}
else
{
for(int i=bid[l]+1;i<bid[r];i++)res+=tagb[i];
for(int i=l;i<=br[bid[l]];i++)res+=a[i];
for(int i=bl[bid[r]];i<=r;i++)res+=a[i];
}
return res;
}
void write(int x)
{
if(x>9)write(x/10);
putchar(x%10+'0');
}
signed main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
int s=100;
int len=300;
for(int i=1;i<=n;i++)
{
bid[i]=(i-1)/len+1;
tagb[bid[i]]+=a[i];
if(bid[i]!=bid[i-1])
{
bl[bid[i]]=i;
tagb[bid[i-1]]%=mod;
br[bid[i-1]]=i-1;
}
}
tagb[bid[n]]%=mod;
int x,y,z,l,r;
long long ans;
while(m--)
{
int opt=read();
if(opt==1)
{
x=read(),y=read(),z=read();
if(x<=s)for(int j=y;j<=x;j++)tag[x][j]=(tag[x][j]+z)%mod;
else
for(int j=y;j<=n;j+=x)add(j,z);
}
else
{
l=read(),r=read();
ans=query(l,r);
for(int j=1;j<=s;j++)
{
ans=ans+1ll*r/j*tag[j][j]%mod+tag[j][r%j];
ans=ans+mod*2-1ll*(l-1)/j*tag[j][j]%mod-tag[j][(l-1)%j];
}
ans=ans%mod;
write(ans);
putchar('\n');
}
}
return 0;
}