#include #define int long long using namespace std; const int N=2e5+10,mod=1e9+7; int n,m,a[N],tag[N<<2]; struct dat{ int sum1,sum2; dat operator+(const dat&x)const{ dat res={sum1+x.sum1,sum2+x.sum2}; return res; } }val[N<<2]; void push_down(int u,int l,int r){ if(!tag[u]) return ; int mid=(l+r)>>1; tag[u<<1]+=tag[u]; tag[u<<1|1]+=tag[u]; (val[u<<1].sum2+=tag[u]*tag[u]%mod*(mid-l+1)%mod+tag[u]*2%mod*val[u<<1].sum1%mod)%=mod; (val[u<<1|1].sum2+=tag[u]*tag[u]%mod*(r-mid)%mod+tag[u]*2%mod*val[u<<1|1].sum1%mod)%=mod; (val[u<<1].sum1+=tag[u]*(l-mid+1)%mod)%=mod; (val[u<<1|1].sum1+=tag[u]*(r-mid)%mod)%=mod; tag[u]=0; return ; } void build(int l,int r,int u){ if(l==r){ val[u]={a[l],a[l]*a[l]}; return ; } int mid=(l+r)>>1; build(l,mid,u<<1); build(mid+1,r,u<<1|1); val[u]=val[u<<1]+val[u<<1|1]; } void update(int ll,int rr,int l,int r,int k,int u){ if(ll<=l&&rr>=r){ tag[u]+=k; (val[u].sum2+=k*k*(r-l+1)%mod+k*2*val[u].sum1%mod)%=mod; (val[u].sum1+=k*(r-l+1)%mod)%=mod; return ; } push_down(u,l,r); int mid=(l+r)>>1; if(ll<=mid) update(ll,rr,l,mid,k,u<<1); if(rr>mid) update(ll,rr,mid+1,r,k,u<<1|1); val[u]=val[u<<1]+val[u<<1|1]; } dat query(int ll,int rr,int l,int r,int u){ if(ll<=l&&rr>=r) return val[u]; push_down(u,l,r); int mid=(l+r)>>1; dat res={0,0}; if(ll<=mid) res=res+query(ll,rr,l,mid,u<<1); if(rr>mid) res=res+query(ll,rr,mid+1,r,u<<1|1); return res; } signed main(){ // freopen("in.in","r",stdin); // freopen("out.out","w",stdout); ios::sync_with_stdio(0); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; build(1,n,1); cin>>m; while(m--){ int op; int l,r,x; cin>>op; if(op==2){ cin>>l>>r; cout<>l>>r>>x; update(l,r,1,n,x,1); } } }