#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
int base = 1<<18;
vector<int> t(2*base), poz(2*base);
void update(int x, int val) {
	x+=base;
	t[x] = val;
	x/=2;
	while(x > 0) {
		t[x] = max(t[x+x], t[x+x+1]);
		x/=2;
	}
}
int query(int a, int b) {
	a += base-1;
	b += base+1;
	int ans = 0;
	while(a/2 != b/2) {
		if(a%2==0) ans = max(ans, t[a+1]);
		if(b%2==1) ans = max(ans, t[b-1]);
		a/=2; b/=2;
	}
	return ans;
}
int ans(int a, int b) {
	int val = query(a, b);
	int mid = poz[val];
	int odp = 0;
	if(mid!=a) {
		odp = max(odp, mid-poz[query(a, mid-1)] + ans(a, mid-1));
	}
	if(mid!=b) {
		odp = max(odp, poz[query(mid+1, b)]-mid + ans(mid+1, b));
	}
	return odp;
}
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	for(int i=0; i<n; ++i) {
		int x; cin >> x;
		poz[x] = i;
		update(i, x);
	}
	cout << ans(0, n-1) << "\n";
	return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |