#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 11;
int n, p, s, ans;
int a[MAXN];
int l[MAXN][20], r[MAXN][20], mx[MAXN][20];
stack < int > st;
void init(int N, std::vector<int> H) {
n = N;
for(int i = 0; i < n; i++) a[i] = H[i];
for(int i = 0; i < n; i++){
while(st.size() && a[st.top()] < a[i]) st.pop();
l[i][0] = (st.empty() ? i : st.top()), st.push(i);
}
for(int i = n - 1; i >= 0; i--){
while(st.size() && a[st.top()] < a[i]) st.pop();
r[i][0] = (st.empty() ? i : st.top()), st.push(i);
}
for(int i = 0; i < n; i++) mx[i][0] = (a[l[i][0]] > a[r[i][0]] ? l[i][0] : r[i][0]);
for(int k = 1; k < 20; k++)
for(int i = 0; i < n; i++)
l[i][k] = l[l[i][k - 1]][k - 1], r[i][k] = r[r[i][k - 1]][k - 1], mx[i][k] = mx[mx[i][k - 1]][k - 1];
}
int minimum_jumps(int A, int B, int C, int D) {
p = s = B, ans = 0;
for(int i = 19; i >= 0; i--)
if(r[p][i] < C)
p = r[p][i];
if(r[p][0] < C || r[p][0] > D) return -1;
for(int i = 19; i >= 0; i--)
if(a[l[s][i]] < a[p] && l[s][i] >= A)
s = l[s][i];
if(l[s][0] >= A && C <= r[l[s][0]][0] && r[l[s][0]][0] <= D) return 1;
for(int i = 19; i >= 0; i--)
if(a[mx[s][i]] <= a[p])
s = mx[s][i], ans += (1 << i);
if(r[s][0] != p && C <= r[l[s][0]][0] && r[l[s][0]][0] <= D) return ans + 2;
for(int i = 19; i >= 0; i--)
if(r[s][i] < C)
s = r[s][i], ans += (1 << i);
s = r[s][0], ans++;
if(C <= s && s <= D) return ans;
else return -1;
}
# | 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... |