, , () , . ( , , , , , .)
max min . O(1), , push_back, pop_front, min max O(1).
, , , ( pop_front pop_back), : , , min max, . , min max, min max, , .
? , , . , . " ", O(1) () () .
: - - , - - . , , . , , . , . , , - , , , .
, O(1), ( ). , O(1) : a pop_front . . (, , O(1).)
, min-max min-max .
. -, , , . ( min-max mins maxes.) , .
, , . , , , , min/max .
, , ++:
#include <algorithm>
#include <vector>
using std::min;
using std::max;
struct minmax { int min; int max; };
int maxrange(const std::vector<int>& v, int n) {
int sz = v.size();
n = min(n, sz);
if (n <= 1) return 0;
minmax* stack = new minmax[n];
int loback, hiback, lofront, hifront;
int maxrange = 0;
for (int s = n - 1, m = 0; s < sz; ++s, --m) {
if (m == 0) {
lofront = hifront = v[s];
loback = hiback = v[s - 1];
for (int i = 2; i < n; ++i) {
stack[i - 2] = minmax{loback, hiback};
loback = min(loback, v[s - i]);
hiback = max(hiback, v[s - i]);
}
m = n - 1;
} else {
lofront = min(lofront, v[s]);
hifront = max(hifront, v[s]);
loback = stack[m-1].min;
hiback = stack[m-1].max;
}
maxrange = max(maxrange, max(hifront, hiback) - min(lofront, loback));
}
delete[] stack;
return maxrange;
}