rt,TLE on 55
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
#define fi first
#define se second
#define endl '\n'
#define mp make_pair
#define pb push_back
#define all(x) x.begin(),x.end()
#define Cl(x) memset(x,0,sizeof(x))
const bool DC=0;
const ll mod=1e9+7;
const int N=0;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll qpow(ll a,ll b,ll p=mod){ll ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
void NO(){cout<<"NO\n";}
void YES(){cout<<"YES\n";}
mt19937 rnd((unsigned long long)new char);
inline char gc () {
static char buf[1048576], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1048576, stdin), p1 == p2) ? EOF : *p1 ++ ;
}
int read () {
int ans = 0; char ch = gc();
while(!isdigit(ch)) ch = gc();
while(isdigit(ch)) ans = ans * 10 + ch - '0', ch = gc();
return ans;
}
int w[100005];
struct mat{
ll a[3][3];
mat(int i=0){a[1][1]=a[2][2]=i,a[1][2]=a[2][1]=0;}
mat operator *(const mat&b)const{
mat ans;
ans.a[1][1]=(a[1][1]*b.a[1][1]+a[1][2]*b.a[2][1])%mod;
ans.a[1][2]=(a[1][1]*b.a[1][2]+a[1][2]*b.a[2][2])%mod;
ans.a[2][1]=(a[2][1]*b.a[1][1]+a[2][2]*b.a[2][1])%mod;
ans.a[2][2]=(a[2][1]*b.a[1][2]+a[2][2]*b.a[2][2])%mod;
return ans;
}
mat operator+(const mat&b)const{
mat ans;
ans.a[1][1]=(a[1][1]+b.a[1][1])%mod;
ans.a[1][2]=(a[1][2]+b.a[1][2])%mod;
ans.a[2][1]=(a[2][1]+b.a[2][1])%mod;
ans.a[2][2]=(a[2][2]+b.a[2][2])%mod;
return ans;
}
bool operator==(const mat&b)const{
return a[1][1]==b.a[1][1]&&a[1][2]==b.a[1][2]&&a[2][1]==b.a[2][1]&&a[2][2]==b.a[2][2];
}
}a[400005],lz[400005],bs,I(1);
mat qpow(mat a,ll b){
mat ans(1);
for(;b;b>>=1,a=a*a)if(b&1)ans=ans*a;
return ans;
}
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
void build(int p,int l,int r){
lz[p]=I;
if(l==r){
a[p]=qpow(bs,w[l]-1);
return;
}
build(ls,l,mid);build(rs,mid+1,r);
a[p]=a[ls]+a[rs];
}
void pd(int p){
if(lz[p]==I)return;
a[ls]=a[ls]*lz[p];
lz[ls]=lz[ls]*lz[p];
a[rs]=a[rs]*lz[p];
lz[rs]=lz[rs]*lz[p];
lz[p]=I;
}
void chg(int p,int l,int r,int L,int R,int v){
if(l>=L&&r<=R){
a[p]=a[p]*qpow(bs,v);
lz[p]=lz[p]*qpow(bs,v);
return;
}
pd(p);
if(L<=mid)chg(ls,l,mid,L,R,v);
if(R>mid)chg(rs,mid+1,r,L,R,v);
a[p]=a[ls]+a[rs];
}
ll qry(int p,int l,int r,int L,int R){
if(l>=L&&r<=R)return a[p].a[1][1];
ll tmp=0;
pd(p);
if(L<=mid)tmp=tmp+qry(ls,l,mid,L,R);
if(R>mid) tmp=tmp+qry(rs,mid+1,r,L,R);
return tmp%mod;
}
void __INIT__(){bs.a[1][1]=bs.a[1][2]=bs.a[2][1]=1;}
void __SOLVE__(int _case){
const int n=read(),m=read();
for(int i=1;i<=n;i++)w[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++){
const int op=read(),l=read(),r=read();
if(op==1){
chg(1,1,n,l,r,read());
}else{
cout<<qry(1,1,n,l,r)<<endl;
}
}
}
int main(){/*freopen(".in","r",stdin);freopen(".out","w",stdout);*/__INIT__();int T;DC?cin>>T,1:T=1;for(int _CASE=1;_CASE<=T;_CASE++)__SOLVE__(_CASE);return 0;}
不知道还有什么地方可以卡常了