Untitled

 avatar
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