0分求助
查看原帖
0分求助
206676
YaeMik0楼主2021/6/12 08:06
#include<bits/stdc++.h>
#define mod 1000000007
#define int long long
#define N 100010
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
using namespace std;
int n,m;
int a[N],tr[N*4],ptr[N*4],lz[N*4];
inline int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int qpow(int x,int b){
    int res=1;
    while(b){if(b&1)res=res*x%mod;x<<=1,x%=mod,b>>=1;}
    return res;
}
void build(int p,int l,int r){
    if(l==r){tr[p]=a[l];ptr[p]=a[l]*a[l];return;}
    build(ls,l,mid);build(rs,mid+1,r);
    tr[p]=tr[ls]+tr[rs];ptr[p]=ptr[ls]+ptr[rs];
}
void modify_area(int p,int l,int r,int pos,int x){
    if(l==r){ptr[p]=ptr[p]+2*x*tr[p]+x*x*(r-l+1);tr[p]+=x*(r-l+1);return;}
    if(pos<=mid)modify_area(ls,l,mid,pos,x);else modify_area(rs,mid+1,r,pos,x);
    ptr[p]=ptr[ls]+ptr[rs];tr[p]=tr[ls]+tr[rs];
}
int query1(int p,int l,int r,int ql,int qr){
    if(l>qr||r<ql)return 0;
    if(l>=ql&&r<=qr)return tr[p];
    return query1(ls,l,mid,ql,qr)+query1(rs,mid+1,r,ql,qr);
}
int query2(int p,int l,int r,int ql,int qr){
    if(l>qr||r<ql)return 0;
    if(l>=ql&&r<=qr)return ptr[p];
    return query2(ls,l,mid,ql,qr)+query2(rs,mid+1,r,ql,qr);
}
int variance(int p,int l,int r,int ql,int qr){
    int q1=query1(p,l,r,ql,qr)%mod;
    int q2=query2(p,l,r,ql,qr)%mod;
    int inv=qpow((qr-ql+1),mod-2);
    int ave=q1*inv%mod;
    int ans=q2*inv%mod-ave*ave%mod;
    return (ans%mod+mod)%mod;
}
signed main(){
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    build(1,1,n);
    for(int t=1;t<=m;t++){
        int type=read(),x=read(),y=read();
        if(type==1)modify_area(1,1,n,x,y);
        if(type==2){printf("%lld\n",variance(1,1,n,x,y));}
    }
    return 0;
}
2021/6/12 08:06
加载中...