快调
查看原帖
快调
575066
ALL_FallsDown楼主2024/10/16 18:29
#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
using namespace std;
int n,m,a[10000005];
struct node{
    int sum,summ;
}tree[5000005];
void build(int x,int y,int p){
    if(x==y){
        tree[p].sum=a[x]%mod;
        tree[p].summ=(a[x]*a[x])%mod;
        return ;
    }
    int mid=(x+y)/2;
    build(x,mid,p*2);
    build(mid+1,y,p*2+1);
    tree[p].sum=(tree[p*2].sum+tree[p*2+1].sum)%mod;
    tree[p].summ=(tree[p*2].summ+tree[p*2+1].summ)%mod;
}
void change(int x,int y,int s,int k,int p){
    if(x==y){
        tree[p].sum=k%mod;
        tree[p].summ=k*k%mod;
        return ;
    }
    int mid=(x+y)/2;
    if(mid>=s) change(x,mid,s,k,p*2);
    if(mid<s) change(mid+1,y,s,k,p*2+1);
    tree[p].sum=(tree[p*2].sum+tree[p*2+1].sum)%mod;
    tree[p].summ=(tree[p*2].summ+tree[p*2+1].summ)%mod;
}
node find(int x,int y,int s,int t,int p){
    if(x>=s&&y<=t){
        return tree[p];
    }
    int mid=(x+y)/2;
    if(mid<s) find(mid+1,y,s,t,p*2+1);
    if(mid>=t) find(x,mid,s,t,p*2);
    else {
        node al,bl,ans;
        al=find(x,mid,s,t,p*2);
        bl=find(mid+1,y,s,t,p*2+1);
        ans.sum=(al.sum+bl.sum)%mod;
        ans.summ=(al.summ+bl.summ)%mod;
        return ans;
    }
}
int qpow(int b, int p = mod - 2, int m = mod) {
	b %= m;
	int s = 1 % m;
	for(; p; p >>= 1, b = b * b % m)
		if(p & 1) s = s * b % m;
	return s;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int op;
        cin>>op;
        if(op==1){
            int x,k;
            cin>>x>>k;
            change(1,n,x,k,1);
        }
        if(op==2){
            int l,r;
            cin>>l>>r;
            node num=find(1,n,l,r,1);
            int k=qpow(r-l+1);
            cout<<(num.summ*k+mod+mod-num.sum*num.sum*k*k%mod)%mod<<endl;
        }
    }
    return 0;
}
2024/10/16 18:29
加载中...