1+ #pragma GCC optimize("Ofast")
2+ #pragma GCC optimize("unroll-loops")
3+ #include < bits/stdc++.h>
4+ using namespace std ;
5+
6+ typedef long long ll;
7+ #define fast_cin () \
8+ ios_base::sync_with_stdio (false ); \
9+ cin.tie(NULL ); \
10+ cout.tie(NULL );
11+
12+ set<ll> sums;
13+
14+ void processHeights (vector<ll> &h) {
15+ int n = h.size ();
16+ ll maxSeen = h[n - 1 ];
17+ ll minSeen = h[n - 1 ];
18+
19+ ll biggestDown = 0 ;
20+ ll biggestUp = 0 ;
21+
22+ for (int i = n - 2 ; i >= 0 ; i--) {
23+ ll down = minSeen - h[i];
24+ ll up = maxSeen - h[i];
25+
26+ biggestDown = min (biggestDown, down);
27+ biggestUp = max (biggestUp, up);
28+
29+ minSeen = min (minSeen, h[i]);
30+ maxSeen = max (maxSeen, h[i]);
31+ }
32+
33+ for (ll i = biggestDown; i <= biggestUp; i++) {
34+ sums.insert (i);
35+ }
36+ }
37+
38+ int main () {
39+ fast_cin ();
40+ int tc;
41+ cin >> tc;
42+ while (tc--) {
43+ int n;
44+ vector<ll> rightActions, leftActions;
45+ vector<ll> right;
46+ vector<ll> left;
47+ sums.clear ();
48+
49+ cin >> n;
50+
51+ vector<ll> arr (n);
52+ ll x = 0 ;
53+ int xidx = 0 ;
54+ for (int i = 0 ; i < n; i++) {
55+ cin >> arr[i];
56+ if (arr[i] > 1 || arr[i] < -1 ) {
57+ xidx = i;
58+ }
59+ }
60+ x = arr[xidx];
61+
62+ leftActions = vector<ll>(arr.begin (), arr.begin () + xidx);
63+ rightActions = vector<ll>(arr.begin () + xidx + 1 , arr.end ());
64+
65+ ll sumLeft = 0 ;
66+ for (int i = 0 ; i < leftActions.size (); i++) {
67+ sumLeft += leftActions[i];
68+ }
69+
70+ left.assign (leftActions.size () + 1 , 0 );
71+ left[0 ] = -sumLeft;
72+ for (int i = 1 ; i < left.size (); i++) {
73+ left[i] = left[i - 1 ] + leftActions[i - 1 ];
74+ }
75+ assert (left.back () == 0 );
76+
77+ right.assign (rightActions.size () + 1 , 0 );
78+ right[0 ] = 0 ;
79+ for (int i = 1 ; i < right.size (); i++) {
80+ right[i] = right[i - 1 ] + rightActions[i - 1 ];
81+ }
82+
83+ processHeights (left);
84+ processHeights (right);
85+
86+ ll maxLeft = *max_element (left.begin (), left.end ());
87+ ll minLeft = *min_element (left.begin (), left.end ());
88+ ll maxRight = *max_element (right.begin (), right.end ());
89+ ll minRight = *min_element (right.begin (), right.end ());
90+
91+ ll up = maxRight - minLeft;
92+ for (int i = 0 ; i <= up; i++) {
93+ sums.insert (i + x);
94+ }
95+
96+ ll down = minRight - maxLeft;
97+ for (int i = down; i <= 0 ; i++) {
98+ sums.insert (i + x);
99+ }
100+
101+ cout << sums.size () << endl;
102+ for (auto i : sums) {
103+ cout << i << " " ;
104+ }
105+ cout << endl;
106+ }
107+ return 0 ;
108+ }
0 commit comments