В O (n log n) есть решение:
Создать вектор индекса = 0 1 2 ... n-1
Сортировка (способом стабильный ) индексы i, j
так, чтобы a[i] < a[i]
Определить значения max_index
max_index[i]= max (index[j], j >= i)
Это можно вычислить рекурсивным образом O (n)
Для каждого индекса [i] определите
index_max[i+1] - ind[i]);
и определите максимальное из них
Максимум, который мы получили, и есть искомое значение.
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
int diff_max (const std::vector<long long int> &a) {
int n = a.size();
std::vector<int> index(n), index_max(n);
int dmax = 0;
std::iota (index.begin(), index.end(), 0);
std::stable_sort (index.begin(), index.end(), [&a] (int i, int j) {return a[i] < a[j];});
index_max[n-1] = index[n-1];
for (int i = n-2; i >= 0; --i) {
index_max[i] = std::max (index_max[i+1], index[i]);
}
for (int i = 0; i < n-1; ++i) {
dmax = std::max (dmax, index_max[i+1] - index[i]);
}
return dmax;
}
int main() {
int t, n;
std::cin >> t;
while(t--) {
std::cin >> n;
std::vector<long long int> a(n);
for (int i = 0; i < n; ++i)
std::cin >> a[i];
auto max = diff_max (a);
std::cout << max << "\n";
}
return 0;
}