# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1138257 | AbdullahIshfaq | 밀림 점프 (APIO21_jumps) | C++20 | 0 ms | 0 KiB |
// #include "jumps.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5, LOG = 18;
int N, H[MAXN], L[MAXN][LOG], R[MAXN][LOG], T[MAXN][LOG], mx;
stack <int> st;
void init(int n, vector<int> h) {
N = n;
H[0] = H[N+1] = N+1;
for (int i=1;i<=N;i++) {
H[i] = h[i-1];
}
st.push(0);
R[0][0] = R[N+1][0] = N+1;
for (int i=1;i<=N+1;i++) {
while (H[st.top()] < H[i]) {
R[st.top()][0] = i;
st.pop();
}
L[i][0] = st.top();
st.push(i);
}
for (int i=0;i<=N+1;i++) {
if (H[L[i][0]] > H[R[i][0]]) {
T[i][0] = L[i][0];
}
else {
T[i][0] = R[i][0];
}
}
for (int i=1;i<LOG;i++) {
for (int j=0;j<=N+1;j++) {
T[j][i] = T[T[j][i-1]][i-1];
L[j][i] = L[L[j][i-1]][i-1];
R[j][i] = R[R[j][i-1]][i-1];
}
}
}
int minimum_jumps(int A, int B, int C, int D) {
A++;
B++;
C++;
D++;
mx = B;
for (int i=LOG-1;i>=0;i--) {
if (R[mx][i] < C) {
mx = R[mx][i];
}
}
mx = R[mx][0];
if (mx > D) {
return -1;
}
for (int i=LOG-1;i>=0;i--) {
if (H[L[B][i]] <= H[mx] && L[B][i] >= A) {
B = L[B][i];
}
}
if (L[B][0] >= A && R[L[B][0]][0] <= D) {
return 1;
}
int ans = 0;
for (int i=LOG-1;i>=0;i--) {
if (H[T[B][i]] <= H[mx]) {
ans += 1<<i;
B = T[B][i];
}
}
if (R[B][0] == mx) {
return ans+1;
}
if (R[L[B][0]][0] <= D) {
return ans+2;
}
for (int i=LOG-1;i>=0;i--) {
if (R[B][i] <= mx) {
ans += 1<<i;
B = R[B][i];
}
}
return ans;
}
int main() {
int N, Q;
assert(2 == scanf("%d %d", &N, &Q));
std::vector<int> H(N);
for (int i = 0; i < N; ++i) {
assert(1 == scanf("%d", &H[i]));
}
init(N, H);
for (int i = 0; i < Q; ++i) {
int A, B, C, D;
assert(4 == scanf("%d %d %d %d", &A, &B, &C, &D));
printf("%d\n", minimum_jumps(A, B, C, D));
}
return 0;
}