// #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;
    }
};
struct cvecp{
    vector<pii> v;
    int n;
    int m;
    cvecp(int n, int m, pii init){
        this->n = n;
        this->m = m;
        v.resize(n*m, init);
    }
    pii get(int i, int j){
        return v[(i*m)+j];
    }
    void set(int i, int j, pii 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--;
 
    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;
    int cand = INF;
    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 = pos[toInd[c]+1];
        int prev = pos[toInd[c]-1];
        auto psh = [&](int D, int R, int C){
            if(dist.get(R,toInd[C]) <= D) {
                return;
            }
            if(D+abs(R- er) >= cand) return;
            if(R == er && C == ec){
                cand = D;
            }
            pq.push({D,R,C});
        };
        // horizontal
        if(prev >= 0) psh(abs(c-prev)+d,r,prev);
        else if(r-1 >= 0){
            psh(d+1,r-1,arr[r-1]);
        }
        if(nxt <= arr[r]) psh(abs(c-nxt)+d,r,nxt);
        else if(r+1 < n){
             psh(d+1,r+1,0);  
        }
        // vertical 
        if(r > 0) psh(d+1,r-1,min(c,arr[r-1])); 
        if(r+1 < n) psh(d+1,r+1,min(c,arr[r+1])); 
    }
    cout << dist.get(er,toInd[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... |