#include <bits/stdc++.h>
using namespace std;
const int maxn = 300005;
int h[maxn], dp[maxn];
int nxt[maxn][2];
int st[maxn], num[maxn], head;
void init1(int n) {
  nxt[n][1] = -1;
  head = 0;
  st[++head] = h[n];
  num[head] = n;
  for (int i = n - 1; i >= 1; i--) {
    while (head && st[head] <= h[i]) head--;
    if (!head)
      nxt[i][1] = -1;
    else
      nxt[i][1] = num[head];
    st[++head] = h[i];
    num[head] = i;
  }
}
void init2(int n) {
  nxt[n][0] = -1;
  head = 0;
  st[++head] = h[n];
  num[head] = n;
  for (int i = n - 1; i >= 1; i--) {
    while (head && st[head] >= h[i]) head--;
    if (!head)
      nxt[i][0] = -1;
    else
      nxt[i][0] = num[head];
    st[++head] = h[i];
    num[head] = i;
  }
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> h[i];
  init1(n);
  init2(n);
  for (int i = 1; i <= n; i++) dp[i] = maxn;
  dp[1] = 0;
  queue<int> q;
  q.push(1);
  while (!q.empty()) {
    int now = q.front();
    q.pop();
    if (now == n) {
      cout << dp[n] << '\n';
      return 0;
    }
    if (dp[now + 1] > dp[now] + 1) {
      q.push(now + 1);
      dp[now + 1] = dp[now] + 1;
    }
    if (h[now + 1] == h[now]) continue;
    int mark = 0;
    if (h[now + 1] < h[now]) mark = 1;
    int tp = now + 1;
    while (1) {
      int x = nxt[tp][mark];
      if (x == -1) break;
      if (dp[x] > dp[now] + 1) {
        q.push(x);
        dp[x] = dp[now] + 1;
      }
      tp = x;
      if (mark == 0 && h[tp] <= h[now] || mark == 1 && h[tp] >= h[now]) {
        int fin = nxt[tp][mark];
        if (fin != -1) {
          tp = now + 1;
          while (tp != fin) {
            int gg = nxt[tp][mark];
            nxt[tp][mark] = fin;
            tp = gg;
          }
        }
        break;
      }
    }
  }
}
