https://www.luogu.com.cn/problem/T576143?contestId=233561

#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
using ll = long long;
using pii = pair<int, int>;
const double PI = acos(-1);
const int N =3e5+10;
const int mod = 1e9 + 7;
int a[N];
int pre[N];
ll f[N];//f[i]:表示s[i,i+1]s[i,i+2]....s[i,n]
ll pre_f[N];//表示f[]数组的前缀
ll pre_num[N];//表示f[]数组的数量积累
int n;
ll find(ll l){
	int L=1,R=n;
	while(L<R){
		int mid=(L+R)>>1;
		if(pre_num[mid]>=l){
			R=mid;
		}
		else L=mid+1;
	}
	int x=L;//第x层
	int cnt=l-pre_num[x-1];//x层还有剩的
	ll ans=pre_f[x-1];//x-1层是满的
	if(cnt){
		int y=x+cnt;
		ans+=f[x]-f[y]-((pre[y-1]-pre[x-1])*(n-y+1));//x层剩的可以通过y层退出来
	}
	return ans;
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		pre[i]=pre[i-1]+a[i];
//		cout<<pre[i]<<" ";
	}
//	cout<<endl;
	for(int i=1;i<=n;i++){
		f[1]+=pre[i];
	}
//	cout<<f[1]<<" ";
	pre_num[1]=n;
	pre_f[1]=f[1];
	for(int i=2;i<=n;i++){
		f[i]=f[i-1]-(a[i-1]*(n-(i-2)));
		pre_num[i]+=pre_num[i-1]+(n-(i-1));
		pre_f[i]=pre_f[i-1]+f[i];
//		cout<<f[i]<<" ";
	}
//	cout<<endl;
	int q;cin>>q;
	while(q--){
		ll l,r;cin>>l>>r;
		cout<<find(r)-find(l-1)<<endl;
	}
	
}
int main() {
	
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	
	int T = 1;
//    cin>>T;
	while (T--) {
		solve();
	}
	
	return 0;
}

题解:
s[]s[]s[]
s[]s[]s[]s[]
s[]s[]s[]s[]s[]