func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 3e5 + 100;   const int oo = 1e9 + 7;   int N;   int H[MAXN];   deque<int> dq;   int L[MAXN], R[MAXN], l[MAXN], r[MAXN];   int d[MAXN];   vector<int> G[MAXN];   void Dijkstra(int u) {     for (int i = (1), _b = (N + 1); i <= _b; ++i) d[i] = +oo;     d[u] = 0;     priority_queue<pair<int, int>, vector<pair<int, int>>,                    greater<pair<int, int>>>         pq;     pq.push(pair<int, int>(0, u));     while (pq.size()) {       int du = pq.top().first;       int u = pq.top().second;       pq.pop();       if (du != d[u]) continue;       for (auto &v : G[u]) {         if (d[v] > du + 1) {           d[v] = du + 1;           pq.push(pair<int, int>(d[v], v));         }       }     }   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> N;     for (int i = (1), _b = (N); i <= _b; ++i) cin >> H[i];     dq.clear();     for (int i = (N), _a = (1); i >= _a; --i) {       while (dq.size() && H[dq.front()] <= H[i]) dq.pop_front();       if (dq.size())         R[i] = dq.front() - 1;       else         R[i] = i;       dq.push_front(i);     }     dq.clear();     for (int i = (1), _b = (N); i <= _b; ++i) {       while (dq.size() && H[dq.front()] <= H[i]) dq.pop_front();       if (dq.size())         L[i] = dq.front() + 1;       else         L[i] = i;       dq.push_front(i);     }     dq.clear();     for (int i = (1), _b = (N); i <= _b; ++i) {       while (dq.size() && H[dq.front()] >= H[i]) dq.pop_front();       if (dq.size())         l[i] = dq.front() + 1;       else         l[i] = i;       dq.push_front(i);     }     dq.clear();     for (int i = (N), _a = (1); i >= _a; --i) {       while (dq.size() && H[dq.front()] >= H[i]) dq.pop_front();       if (dq.size())         r[i] = dq.front() - 1;       else         r[i] = i;       dq.push_front(i);     }     for (int i = (1), _b = (N); i <= _b; ++i) G[i].push_back(i + 1);     for (int i = (1), _b = (N); i <= _b; ++i) {       if (H[i] < min(H[L[i] - 1], H[R[i] + 1])) {         G[L[i] - 1].push_back(R[i] + 1);       }     }     for (int i = (1), _b = (N); i <= _b; ++i) {       if (max(H[l[i] - 1], H[r[i] + 1]) < H[i]) {         G[l[i] - 1].push_back(r[i] + 1);       }     }     Dijkstra(1);     cout << d[N] <<   n ;     return 0;   }   