#include #include using namespace std; #define N 10000 int n; int ans[N], q[N]; void blockmin(int d, int *x, int *ans) { // d is the block size // x[] is an array of size n // the answer is returned in an array ans[] of size at least n-d+1 int q1 = 0, q2 = 0; for (int i = 0; i < n; i++) { while (q1 > q2 && x[q[q1 - 1]] >= x[i]) q1--; q[q1++] = i; if (i >= d && q[q2] == i - d) q2++; if (i >= d-1) { ans[i-(d-1)] = x[q[q2]]; } } } int main() { int x[] = {1,2,3,4,3,2,1}; n = 7; int d = 3; blockmin (d, x, ans); for (int i=0; i