#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
const int INF = 1e9 + 7;
int n, tot, isDel[N];
struct Node {
  int val, pre, nxt;
  Node() {}
  Node(int _v, int _p, int _n) { val = _v, pre = _p, nxt = _n; }
} a[N];
void del(int id) {
  int pre = a[id].pre;
  int nxt = a[id].nxt;
  a[pre].nxt = nxt;
  a[nxt].pre = pre;
}
void out() {
  int p = a[0].nxt;
  while (p != tot) {
    printf("%d ", a[p].val);
    p = a[p].nxt;
  }
  puts("");
}
int main() {
  scanf("%d", &n);
  a[tot++] = Node(0, 0, 1);
  for (int i = (0); i < (n); ++i) {
    int x;
    scanf("%d", &x);
    a[tot] = Node(x, tot - 1, tot + 1);
    ++tot;
  }
  a[tot] = Node(INF, tot - 1, tot);
  queue<int> que[2];
  int t = 0;
  for (int i = (1); i < (tot); ++i)
    if (a[i - 1].val > a[i].val) que[t].push(i), isDel[i] = true;
  int ans = 0;
  while (!que[t].empty()) {
    ++ans;
    while (!que[t].empty()) {
      int id = que[t].front();
      que[t].pop();
      if (!isDel[a[id].nxt] && a[a[id].pre].val > a[a[id].nxt].val) {
        isDel[a[id].nxt] = true;
        que[t ^ 1].push(a[id].nxt);
      }
      del(id);
    }
    t ^= 1;
  }
  printf("%d", ans);
  return 0;
}
