10pts AC on#1求条
查看原帖
10pts AC on#1求条
951050
lostxxx楼主2024/8/30 11:34
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q;
ll a[200100];
struct node{
    ll l,r;
    ll sum1,sum2;
}tr[1001000];
const ll p=1e9+7;
double qumi(ll a,ll b){
    ll res=1;
    while(b){
        if (b%2)
            res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
void pushup(ll x){
    tr[x].sum1=tr[x<<1].sum1+tr[x<<1|1].sum1;
    tr[x].sum2=tr[x<<1].sum2+tr[x<<1|1].sum2;
}
void build(ll x,ll l,ll r){
    tr[x].l=l;
    tr[x].r=r;
    if (l==r){
        tr[x].sum1=a[l];
        tr[x].sum2=(a[l]*a[l])%p;
        return;
    }
    ll mid=l+r>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
void change1(ll x,ll k,ll d){
    if (tr[x].l==tr[x].r){
        tr[x].sum1*=d;
        tr[x].sum2*=d;
        return;
    }
    ll mid=tr[x].l+tr[x].r>>1;
    if (tr[x<<1].l<=k && k<=tr[x<<1].r)
        change1(x<<1,k,d);
    if (tr[x<<1|1].l<=k && k<=tr[x<<1|1].r)
        change1(x<<1|1,k,d);
    pushup(x);
}
void change2(ll x,ll k,ll d){
    if (tr[x].l==tr[x].r){
        tr[x].sum1+=d;
        (tr[x].sum2+=d*d)%=p;
        return;
    }
    ll mid=tr[x].l+tr[x].r>>1;
    if (tr[x<<1].l<=k && k<=tr[x<<1].r)
        change2(x<<1,k,d);
    if (tr[x<<1|1].l<=k && k<=tr[x<<1|1].r)
        change2(x<<1|1,k,d);
    pushup(x);
}
ll ask1(ll x,ll l,ll r){
    if (l<=tr[x].l && tr[x].r<=r){
        return tr[x].sum1;
    }
    ll mid=tr[x].l+tr[x].r>>1;
    ll res=0;
    if (l<=mid)
        res+=ask1(x<<1,l,r);
    if (mid+1<=r)
        res+=ask1(x<<1|1,l,r);
    return res;
}
ll ask2(ll x,ll l,ll r){
    if (l<=tr[x].l && tr[x].r<=r){
        return tr[x].sum2;
    }
    ll mid=tr[x].l+tr[x].r>>1;
    ll res=0;
    if (l<=mid)
        res+=ask2(x<<1,l,r);
    if (mid+1<=r)
        res+=ask2(x<<1|1,l,r);
    return res;
}
int main(){
    cin>>n>>q;
    for (int i=1;i<=n;i++){
        cin>>a[i];
        a[i]%=p;
    }
    build(1,1,n);
    while(q--){
        ll opt,l,r;
        cin>>opt;
        if (opt==1){
            cin>>l>>r;
            change1(1,l,0);
            change2(1,l,r);
        }else{
            cin>>l>>r;
            //cout<<"ask: "<<ask1(1,l,r)<<endl;
            double sum1=ask1(1,l,r);
            double sum2=ask2(1,l,r);
            // cout<<"sum1: "<<sum1<<" sum2: "<<sum2<<endl;
            double num1=sum2-2*sum1/(r-l+1)*sum1+(r-l+1)*(sum1/(r-l+1))*(sum1/(r-l+1));
            ll num2=r-l+1;
            // cout<<num1<<" "<<num2<<endl;
            cout<<(ll)(num1*qumi(num2,p-2))%p<<endl;
        }
    }
}
2024/8/30 11:34
加载中...