20pts求调(玄关
查看原帖
20pts求调(玄关
1251345
2012_Zhang_楼主2024/11/29 07:32
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=1000000007;
struct tree{
    int l,r,w,w2;
}t[1000000];
int n,m;
bool in(int a,int b,int c,int d){return a<=b&&c<=d;}
bool out(int a,int b,int c,int d){return c<a||d<b;}
int a[1000000],inv[1000000],ave,ans;
int mi(int a,int b,int c){
    int ans=1;
    while(b){
        if(b%2==1) ans*=a,ans%=c;
        a*=a,a%=c,b/=2;
    }
    return ans;
}
void init(){for(int i=1;i<=n;i++) inv[i]=mi(i,p-2,p);}
void build(int u,int L,int R){
    t[u].l=L,t[u].r=R;
    if(L==R){t[u].w=a[L],t[u].w2=a[L]*a[L]%p; return;}
    build(u*2,L,(L+R)/2);
    build(u*2+1,(L+R)/2+1,R);
    t[u].w=(t[u*2].w+t[u*2+1].w)%p;
    t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
    return;
}
void dlzy(int u,int L,int R,int x){
    if(out(L,t[u].l,t[u].r,R))return;
    if(in(L,t[u].l,t[u].r,R)){
        t[u].w=x,t[u].w2=x*x%p;
        return;
    }
    dlzy(u*2,L,R,x);
    dlzy(u*2,L,R,x);
    t[u].w=(t[u*2].w+t[u*2+1].w)%p,t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
    return;
}
int ask(int u,int L,int R){
    if(out(L,t[u].l,t[u].r,R)){
        return 0;
    }
    if(in(L,t[u].l,t[u].r,R)){
        return t[u].w%p;
    }
    t[u].w=(t[u*2].w+t[u*2+1].w)%p,t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
    return (ask(u*2,L,R)+ask(u*2+1,L,R))%p;
}
int ask2(int u,int L,int R){
    if(out(L,t[u].l,t[u].r,R)){
        return 0;
    }
    if(in(L,t[u].l,t[u].r,R)){
        return t[u].w2%p;
    }
    t[u].w=(t[u*2].w+t[u*2+1].w)%p,t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
    return (ask2(u*2,L,R)+ask2(u*2+1,L,R))%p;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    init();
    for(int i=1;i<=m;i++){
        int op;
        cin>>op;
        if(op==1){
            int x,y;
            cin>>x>>y;
            dlzy(1,x,x,y);
        }else{
            int x,y;
            cin>>x>>y;
            int s1=ask(1,x,y),s2=ask2(1,x,y);
            ave=s1*inv[y-x+1]%p;
			ans=s2*inv[y-x+1]%p-ave*ave%p;
			ans=(ans%p+p)%p;
            cout<<ans<<endl;
        }
    }
}
2024/11/29 07:32
加载中...