#include <bits/stdc++.h>
using namespace std;
int a[100002];
int num[100002 * 4];
int max(int a, int b) { return a > b ? a : b; }
void update(int p, int l, int r, int t, int v) {
  if (p == l && p == r) {
    num[t] = v;
    return;
  }
  int m = (l + r) >> 1;
  if (p <= m) update(p, l, m, (t << 1), v);
  if (p > m) update(p, m + 1, r, (t << 1 | 1), v);
  num[t] = max(num[(t << 1)], num[(t << 1 | 1)]);
}
int query(int ll, int rr, int l, int r, int t) {
  if (ll <= l && r <= rr) {
    return num[t];
  }
  int t1 = 0, t2 = 0;
  int m = (l + r) >> 1;
  if (ll <= m) t1 = query(ll, rr, l, m, (t << 1));
  if (rr > m) t2 = query(ll, rr, m + 1, r, (t << 1 | 1));
  return max(t1, t2);
}
struct node {
  int id, v;
};
stack<node> s;
int d[100002];
int main() {
  int n;
  while (scanf("%d", &n) != EOF) {
    int i;
    for (i = 0; i < n; i++) {
      scanf("%d", &a[i]);
    }
    while (!s.empty()) s.pop();
    node t;
    t.id = 0;
    t.v = a[0];
    d[0] = -1;
    s.push(t);
    for (i = 1; i < n; i++) {
      while (!s.empty()) {
        t = s.top();
        if (a[i] > t.v) {
          s.pop();
        } else
          break;
      }
      if (!s.empty()) {
        t = s.top();
        d[i] = t.id;
      } else
        d[i] = -1;
      t.v = a[i];
      t.id = i;
      s.push(t);
    }
    int ans = 0;
    memset(num, 0, sizeof(num));
    for (i = 1; i < n; i++) {
      if (d[i] == -1) {
        update(i, 0, n - 1, 1, 0);
        continue;
      }
      if (a[i - 1] > a[i]) {
        if (ans < 1) ans = 1;
        update(i, 0, n - 1, 1, 1);
        continue;
      }
      int x = query(d[i] + 1, i - 1, 0, n - 1, 1);
      if (x + 1 > ans) ans = x + 1;
      update(i, 0, n - 1, 1, x + 1);
    }
    printf("%d\n", ans);
  }
  return 0;
}
