// #pragma GCC optimize("O3, unroll-loops, Ofast")
// #pragma GCC target("avx2")
#include<bits/stdc++.h>
using namespace std;
// #define int long long
#define pii pair<int,int>
#define tiii tuple<int,int,int>
int INF = numeric_limits<int>::max()/2;
struct cvec{
    vector<int> v;
    int n;
    int m;
    cvec(int n, int m, int init){
        this->n = n;
        this->m = m;
        v.resize(n*m, init);
    }
    int get(int i, int j){
        return v[(i*m)+j];
    }
    void set(int i, int j, int d){
        v[(i*m)+j] = d;
    }
};
int32_t 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--;
    if(er < sr){
        swap(er,sr);
        swap(ec,sc);
    }
    vector<int> arr(n);
    for(int i = 0; i < n; i++){
        cin >> arr[i];
    }
    
    set<int> important;
    for(int i = 0; i < n; i++){
        important.insert(arr[i]);
    }
    important.insert(sc);
    important.insert(ec);
    important.insert(INF);
    important.insert(-INF);
    vector<int> pos(important.begin(),important.end()); 
    map<int,int> toInd;
    for(int i = 0; i < pos.size(); i++){
        toInd[pos[i]] = i;
    }
     
    priority_queue<tiii,vector<tiii>, greater<tiii>> pq; 
    cvec dist(n, pos.size(), INF);  
    
    pq.push({0,sr,sc});
    int iter = 0;
    while(pq.size()){
        int d,r,c;
        tie(d,r,c) = pq.top(); pq.pop();
 
        if(dist.get(r,toInd[c]) < d) continue;
        dist.set(r,toInd[c],d);
        // if(r == er && ec == c) break;
        
        int nxt = *upper_bound(pos.begin(),pos.end(), c);
        auto it =  lower_bound(pos.begin(),pos.end(), c);
        int prev =-INF; 
        if(it != pos.begin()){ 
            it--;
            prev= *it;
        }else{
            prev = -INF;
        }
        // horizontal
        if(prev >= 0) pq.push({abs(c-prev)+d,r,prev});
        else if(r-1 >= 0){
            pq.push({d+1,r-1,arr[r-1]});
        }
        if(nxt <= arr[r]) pq.push({abs(c-nxt)+d,r,nxt});
        else if(r+1 < n){
             pq.push({d+1,r+1,0});  
        }
        // vertical 
        if(r > 0) pq.push({d+1,r-1,min(c,arr[r-1])}); 
        if(r+1 < n) pq.push({d+1,r+1,min(c,arr[r+1])}); 
    }
    cout << dist.get(er,toInd[ec]) << "\n";
}
| # | 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... |