#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define tiii tuple<int,int,int>
int INF = numeric_limits<int>::max()/2;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;
    int sr, sc;
    int er, ec;
    
    cin >> n;
    cin >> sr >> sc;
    cin >> er >> ec;
    sr--;sc--;
    er--;ec--;
    vector<int> arr(n);
    for(int i = 0; i < n; i++){
        cin >> arr[i];
    }
    //priority_queue<tiii, vector<tiii>, greater<tiii>> pq;
    queue<tiii> pq;
    // map<pii, int> dist;
    vector<vector<int>> dist(n,vector<int>(5001, INF));
    pq.push({0,sr,sc});
    int iter = 0;
    while(pq.size()){
        int d,r,c;
        tie(d,r,c) = pq.front(); pq.pop();
 
        if(dist[r][c] < d) continue;
        dist[r][c] = d;
        if(r == er && ec == c) break;
        
        // horizontal
        if(c > 0 && dist[r][c-1] == INF) pq.push({d+1,r,c-1});
        else if(r-1 >= 0&& dist[r-1][arr[r-1]] == INF)pq.push({d+1,r-1,arr[r-1]});
        if(c < arr[r]&& dist[r][c+1] == INF) pq.push({d+1,r,c+1});
        else if(r+1 < n&& dist[r+1][0] == INF) pq.push({d+1,r+1,0});
        // vertical 
        if(r > 0&& dist[r-1][min(c,arr[r-1])] == INF) pq.push({d+1,r-1,min(c,arr[r-1])}); 
        if(r+1 < n&& dist[r+1][min(c,arr[r-1])] == INF) pq.push({d+1,r+1,min(c,arr[r+1])}); 
    }
    cout << dist[er][ec] << endl;
}
| # | 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... |