Untitled
unknown
plain_text
10 months ago
2.5 kB
3
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