| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1317995 | aris12345678 | 밀림 점프 (APIO21_jumps) | C++17 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> height;
vector<vector<int>> adj;
void init(int N, vector<int> H) {
n = N;
height = H;
}
int bfs(int start, int A, int B, int C, int D) {
queue<pair<int, int>> q;
// vector<bool> vis(n, false);
q.push({start, 0});
int ans = INT_MAX;
while(!q.empty()) {
int u = q.front().first, value = q.front().second;
q.pop();
// if(vis[u]) continue;
// vis[u] = true;
if(u >= C && u <= D) {
ans = min(ans, value);
continue;
}
if(u >= A && u <= B) value = 0;
for(int i = 0; i < adj[u].size(); i++)
q.push({adj[u][i], value+1});
}
return ans;
}
int minimum_jumps(int A, int B, int C, int D) {
adj.resize(n);
for(int i = 0; i < n; i++) {
for(int j = i-1; j >= 0; j--) {
if(height[j] > height[i]) {
adj[i].push_back(j);
break;
}
}
for(int j = i+1; j < n; j++) {
if(height[j] > height[i]) {
adj[i].push_back(j);
break;
}
}
}
int pos = 0, mn = INT_MAX;
for(int i = A; i <= B; i++) {
if(mn > height[i])
mn = height[i], pos = i;
}
int ans = bfs(pos, A, B, C, D);
if(ans == INT_MAX) return -1;
return ans;
}
int main() {
int N, Q;
scanf("%d %d", &N, &Q);
vector<int> H(N);
for(int i = 0; i < N; i++)
scanf("%d", &H[i]);
init(N, H);
while(Q--) {
int A, B, C, D;
scanf("%d %d %d %d", &A, &B, &C, &D);
printf("%d\n", minimum_jumps(A, B, C, D));
}
return 0;
}
