1+ /* *
2+ * @file 11106.cpp
3+ * @author Macesuted (i@macesuted.moe)
4+ * @date 2025-05-11
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #define endl ' \n '
14+
15+ #define maxn 500005
16+ #define maxlgn 22
17+
18+ int64_t a[maxn], val[maxlgn][maxn], mxVal[maxlgn][maxn], gl[maxn], gr[maxn];
19+ int nxt[maxlgn][maxn], lg[maxn];
20+ bool cl[maxn], cr[maxn];
21+
22+ void solve (void ) {
23+ int n, q;
24+ cin >> n >> q;
25+ for (int i = 1 ; i <= n; i++) cin >> a[i];
26+
27+ int64_t sum = 0 ;
28+ gl[0 ] = 0 ;
29+ for (int i = 1 ; i <= n; i++) {
30+ if ((sum += a[i]) < 0 ) sum = 0 ;
31+ gl[i] = max (gl[i - 1 ], sum);
32+ }
33+ gr[n + 1 ] = sum = 0 ;
34+ for (int i = n; i; i--) {
35+ if ((sum += a[i]) < 0 ) sum = 0 ;
36+ gr[i] = max (gr[i + 1 ], sum);
37+ }
38+
39+ a[0 ] = 0 ;
40+ for (int i = 1 ; i <= n; i++) a[i] += a[i - 1 ];
41+
42+ for (int i = 0 ; i <= n; i++) mxVal[0 ][i] = a[i];
43+ for (int t = 1 ; t < maxlgn; t++)
44+ for (int i = 0 ; i + (1 << t) - 1 <= n; i++) mxVal[t][i] = max (mxVal[t - 1 ][i], mxVal[t - 1 ][i + (1 << (t - 1 ))]);
45+
46+ auto getMxVal = [&](int l, int r) {
47+ int t = lg[r - l + 1 ];
48+ return max (mxVal[t][l], mxVal[t][r - (1 << t) + 1 ]);
49+ };
50+
51+ int64_t cur = a[0 ];
52+ cl[1 ] = false ;
53+ for (int i = 2 ; i <= n; i++) cur = min (cur, a[i - 2 ]), cl[i] = (a[i - 1 ] - cur >= 0 );
54+ cur = a[n];
55+ cr[n] = false ;
56+ for (int i = n - 1 ; i; i--) cur = max (cur, a[i + 1 ]), cr[i] = (cur - a[i] >= 0 );
57+
58+ stack<int > S;
59+ S.push (n + 1 );
60+ a[n + 1 ] = -1e18 ;
61+ nxt[0 ][n + 1 ] = n + 1 ;
62+ for (int i = n; i >= 0 ; i--) {
63+ while (a[S.top ()] > a[i]) S.pop ();
64+ nxt[0 ][i] = S.top (), val[0 ][i] = getMxVal (i, S.top () - 1 );
65+ S.push (i);
66+ }
67+ for (int t = 1 ; t < maxlgn; t++)
68+ for (int i = 0 ; i <= n + 1 ; i++) {
69+ int j = nxt[t - 1 ][i];
70+ nxt[t][i] = nxt[t - 1 ][j], val[t][i] = max (val[t - 1 ][i], val[t - 1 ][j] + a[i] - a[j]);
71+ }
72+
73+ while (q--) {
74+ int l, r;
75+ cin >> l >> r;
76+ int64_t xxans = max ({(int64_t )0 , gl[l - 1 ], gr[r + 1 ]});
77+ if (cl[l] || cr[r]) {
78+ cout << -1 << endl;
79+ continue ;
80+ }
81+ int p = l - 1 ;
82+ if (nxt[0 ][p] > r) {
83+ int64_t ans = max ((int64_t )0 , getMxVal (l - 1 , r - 1 ) + 1 - a[r]);
84+ cout << ans + max ((int64_t )0 , xxans - (ans + a[r] - a[l - 1 ]) + 1 ) << endl;
85+ continue ;
86+ }
87+ p = nxt[0 ][p];
88+ int64_t delt = a[l - 1 ] - a[p] + 1 , curMxVal = a[l - 1 ];
89+ if (l < p) curMxVal = max (curMxVal, getMxVal (l, p - 1 ));
90+ for (int t = maxlgn - 1 ; ~t; t--)
91+ if (nxt[t][p] <= r) {
92+ curMxVal = max (curMxVal, delt + val[t][p]);
93+ delt += a[p] - a[nxt[t][p]];
94+ p = nxt[t][p];
95+ }
96+ if (p < r) curMxVal = max (curMxVal, delt + getMxVal (p, r - 1 ));
97+ int64_t ans = delt + max ((int64_t )0 , curMxVal + 1 - (a[r] + delt));
98+ cout << ans + max ((int64_t )0 , xxans - (ans + a[r] - a[l - 1 ]) + 1 ) << endl;
99+ }
100+
101+ return ;
102+ }
103+
104+ int main () {
105+ ios::sync_with_stdio (false ), cin.tie (nullptr );
106+
107+ for (int i = 2 ; i < maxn; i++) lg[i] = lg[i >> 1 ] + 1 ;
108+
109+ int _ = 1 ;
110+ cin >> _;
111+ while (_--) solve ();
112+
113+ return 0 ;
114+ }
0 commit comments