Untitled
unknown
plain_text
a year ago
2.5 kB
7
Indexable
#include <iostream>
using namespace std;
#include <bits/stdc++.h>
typedef long long ll ;
ll n, m,mod=1e9+7 ;
int const N=1e5+5 ;
struct st{
ll trb , tk , f ;
};
ll a[N] , laz[4*N] ;
st seg[4*N] ;
ll mult(ll a,ll b)
{
return a*b%mod ;
}
st merg(st lt ,st rt)
{
st ans ;
ans.f=lt.f+rt.f ;
if(ans.f>=mod) ans.f%=mod ;
ans.trb=lt.trb+rt.trb ;
if(ans.trb>=mod) ans.trb%=mod ;
ans.tk=lt.tk+rt.tk ;
if(ans.tk>=mod) ans.tk%=mod ;
return ans ;
}
void bld(int no,int s,int e)
{
if(s==e)
{
seg[no].f=a[s] ;
seg[no].trb=mult(a[s],a[s]) ;
// if(seg[no].trb>=mod) seg[no].trb%=mod ;
seg[no].tk=(a[s]*a[s]*a[s])%mod ;
// if(seg[no].tk>=mod) seg[no].tk%=mod ;
return ;
}
int md=(s+e)/2 ;
bld(no*2,s,md) ;
bld(no*2+1,md+1,e) ;
seg[no]=merg(seg[no*2],seg[no*2+1]) ;
}
void push(int no,ll s,ll e)
{
if(laz[no]) {
st cop=seg[no] ;
ll laztk=mult(laz[no],mult(laz[no],laz[no])) ;
ll f=3*mult(cop.f,mult(laz[no],laz[no])) , sc=3*mult(cop.trb,laz[no]) ;
seg[no].tk=((((cop.tk%mod+laztk%mod)%mod+f%mod)%mod)+sc%mod)%mod ;
f=2*mult(cop.f,laz[no]) ;
seg[no].trb=(((cop.trb+mult(laz[no],laz[no]))%mod)+f)%mod ;
seg[no].f=(cop.f+mult((e-s+1),laz[no]))%mod ;
if(s!=e)
laz[no*2]+=laz[no] , laz[no*2+1]+=laz[no] ;
}
laz[no]=0 ;
}
ll l , r , val ;
void up(int no,int s,int e)
{
push(no,s,e) ;
if(s>r e<l) return ;
if(s>=l && e<=r)
{
laz[no]=val ;
push(no,s,e) ;
return ;
}
int md=(s+e)/2 ;
up(no*2,s,md) ;
up(no*2+1,md+1,e) ;
seg[no]=merg(seg[no*2],seg[no*2+1]) ;
}
ll get(int no,int s,int e)
{
push(no,s,e) ;
if(s>r e<l) return 0 ;
if(s>=l && e<=r) return seg[no].tk ;
int md=(s+e)/2 ;
ll x=get(no*2,s,md) , y=get(no*2+1,md+1,e) ;
return (x+y)%mod ;
}
int main()
{
cin.tie(0);
cin.sync_with_stdio(0);
int t=1 ;
// freopen("optmilk.in","r",stdin) ;
// freopen("optmilk.out","w",stdout) ;
// cin >> t ;
while(t--)
{
cin >> n ;
for(int i=1 ; i<=n ; i++)
cin >> a[i] ;
bld(1,1,n) ;
cin >> m ;
while(m--)
{
int tp ;
cin >> tp ;
if(tp==1)
{
cin >> l >> r >> val ;
up(1,1,n) ;
}
else
{
cin >> l >> r ;
cout << get(1,1,n) << "\n" ;
}
}
}
}Editor is loading...
Leave a Comment