1+ #pragma GCC optimize("Ofast")
2+ #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
3+ #pragma GCC optimize("unroll-loops")
4+ #include < bits/stdc++.h>
5+ using namespace std ;
6+
7+ typedef long long ll;
8+ typedef vector<int > vi;
9+ #define fast_cin () ios_base::sync_with_stdio(false ); cin.tie(NULL ); cout.tie(NULL );
10+
11+ template <typename T=ll>
12+ struct StaticSum {
13+ const int n;
14+ vector<T> pfs; // arr[i] contains the range sum from 0 to i inclusively
15+
16+ T rsq (int l, int r) const { // range sum from l to r inclusively
17+ if (l < 0 || r >= n) assert (false ); // boundary condition check
18+ if (l == 0 ) return pfs[r];
19+ return (pfs[r] - pfs[l - 1 ]);
20+ }
21+
22+ StaticSum (const vector<T>& arr) : n(arr.size()), pfs(arr) {
23+ for (int i = 1 ; i < n; i++) {
24+ pfs[i] += pfs[i - 1 ];
25+ }
26+ }
27+ };
28+
29+ StaticSum<>* ss_brr_ptr;
30+ vector<ll> brr;
31+ vector<ll> segmentSums; // segmentSums[i] = sum of all a[j][k] within the segment i
32+ int n;
33+
34+
35+ pair<ll, ll> getComponents (ll idx){
36+ ll firstComponent = lower_bound (ss_brr_ptr->pfs .begin (), ss_brr_ptr->pfs .end (), idx) - ss_brr_ptr->pfs .begin ();
37+ ll secondComponent = (firstComponent == 0 ? idx : idx - ss_brr_ptr->pfs [firstComponent-1 ]) - 1 ;
38+ return {firstComponent, secondComponent};
39+ }
40+
41+ ll topOfSegment (ll segmentIdx, ll includedRows, StaticSum<>& ss_ss_arr, StaticSum<>& ss_arr){ // gets the first sum of the first includedRows of the segment Idx
42+ ll ans = ss_ss_arr.rsq (0 , segmentIdx+includedRows-1 );
43+ if (segmentIdx > 0 ){
44+ ans -= ss_ss_arr.rsq (0 , segmentIdx-1 );
45+ ans -= (ss_arr.rsq (0 , segmentIdx-1 )) * (includedRows);
46+ }
47+ return ans;
48+ }
49+
50+
51+ ll getUntil (ll idx, StaticSum<>& ss_ss_arr, StaticSum<>& ss_arr, StaticSum<>& ss_segmentSums){ // inclusive of this current one...
52+ pair<ll, ll> components = getComponents (idx);
53+ // cerr << "components: " << components.first << " " << components.second << endl;
54+ ll ans = 0 ;
55+ if (components.first == 0 ){
56+ ans = topOfSegment (components.first , components.second +1 , ss_ss_arr, ss_arr);
57+ }
58+ else {
59+ ans = ss_segmentSums.rsq (0 , components.first -1 ) + topOfSegment (components.first , components.second +1 , ss_ss_arr, ss_arr);
60+ // cerr << "top part " << topOfSegment(components.first, components.second+1, ss_ss_arr, ss_arr) << endl;
61+ }
62+ return ans;
63+
64+ }
65+ int main (){
66+ cin >> n;
67+ vector<ll> arr (n);
68+ for (int i=0 ; i<n; i++){
69+ cin >> arr[i];
70+ }
71+
72+ StaticSum<> ss_arr (arr);
73+ StaticSum<> ss_ss_arr (ss_arr.pfs );
74+
75+ segmentSums.assign (n, 0 );
76+ segmentSums[0 ] = ss_ss_arr.rsq (0 , n-1 ); // sum of prefixes
77+ for (int i=1 ; i<n; i++){
78+ segmentSums[i] = segmentSums[i-1 ] - (n-i+1 ) * arr[i-1 ];
79+ }
80+ // cerr << "segmentSums: ";
81+ // for (int i=0; i<n; i++){
82+ // cerr << segmentSums[i] << " ";
83+ // }
84+ // cerr << endl;
85+ StaticSum<> ss_segmentSums (segmentSums);
86+
87+ assert (segmentSums[n-1 ] == arr[n-1 ]);
88+
89+ brr.assign (n, 0 );
90+ for (int i=0 ; i<n; i++){
91+ brr[i] = n-i;
92+ }
93+ ss_brr_ptr = new StaticSum<>(brr);
94+
95+
96+ int q;
97+ cin >> q;
98+ while (q--){
99+ ll top, bottom;
100+ cin >> top >> bottom;
101+
102+ if (top == 1 ){
103+ cout << getUntil (bottom, ss_ss_arr, ss_arr, ss_segmentSums) << endl;
104+ }
105+ else {
106+ cout << getUntil (bottom, ss_ss_arr, ss_arr, ss_segmentSums) - getUntil (top-1 , ss_ss_arr, ss_arr, ss_segmentSums) << endl;
107+ }
108+ }
109+
110+
111+
112+
113+ return 0 ;
114+ }
0 commit comments