#include <bits/stdc++.h>
using namespace std;
struct SegTree {
  struct node {
    int mx, lazy;
    node() { mx = lazy = 0; }
  };
  vector<node> tree;
  void init(int n) {
    tree.resize(4 * n);
    for (int i = 0; i < ((int)tree.size()); i++) {
      tree[i].mx = tree[i].lazy = 0;
    }
  }
  void push(int tl, int tr, int h) {
    if (tl < tr) {
      tree[h * 2].lazy += tree[h].lazy;
      tree[h * 2 + 1].lazy += tree[h].lazy;
    }
    tree[h].mx += tree[h].lazy;
    tree[h].lazy = 0;
  }
  void update(int l, int r, int x, int tl, int tr, int h = 1) {
    push(tl, tr, h);
    if (l > r || tr < l || r < tl) return;
    if (l <= tl && tr <= r) {
      tree[h].lazy += x;
      push(tl, tr, h);
      return;
    }
    int mid = (tl + tr) / 2;
    update(l, r, x, tl, mid, h * 2);
    update(l, r, x, mid + 1, tr, h * 2 + 1);
    tree[h].mx = max(tree[h * 2].mx, tree[h * 2 + 1].mx);
  }
  int query() { return tree[1].mx; }
  int query(int p, int tl, int tr, int h = 1) {
    push(tl, tr, h);
    if (tr < p || p < tl) return 0;
    if (tl == tr) return tree[h].mx;
    int mid = (tl + tr) / 2;
    return max(query(p, tl, mid, h * 2), query(p, mid + 1, tr, h * 2 + 1));
  }
} mst;
int n;
int a[200010], rev[200010];
int dep[200010], L[200010], R[200010];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int i, j;
  cin >> n;
  set<int> st;
  for (i = 1; i <= n; i++) {
    cin >> a[i];
    rev[a[i]] = i;
  }
  for (i = 1; i <= n; i++) {
    int pos = rev[i];
    if (i > 1) {
      auto it = st.lower_bound(pos);
      if (it == st.end())
        R[pos] = *st.begin();
      else
        R[pos] = *it;
      if (it == st.begin())
        L[pos] = *st.rbegin();
      else
        L[pos] = *prev(it, 1);
      int par = -1;
      if (it == st.end())
        par = *prev(it, 1);
      else if (it == st.begin())
        par = *it;
      else if (a[*prev(it, 1)] < a[*it])
        par = *it;
      else
        par = *prev(it, 1);
      dep[pos] = dep[par] + 1;
    }
    st.insert(pos);
  }
  mst.init(n + 1);
  for (i = 1; i <= n; i++) {
    mst.update(i, i, dep[i], 1, n);
  }
  int ans = mst.query(), ansk = 0;
  for (i = 1; i < n; i++) {
    if (a[i] == 1) continue;
    int delta = mst.query(L[i], 1, n) + 1 - mst.query(i, 1, n);
    mst.update(i, i, delta, 1, n);
    if (i <= R[i]) {
      mst.update(i + 1, R[i] - 1, -1, 1, n);
    } else {
      mst.update(i + 1, n, -1, 1, n);
      mst.update(1, R[i] - 1, -1, 1, n);
    }
    if (L[i] <= i) {
      mst.update(L[i] + 1, i - 1, 1, 1, n);
    } else {
      mst.update(1, i - 1, 1, 1, n);
      mst.update(L[i] + 1, n, 1, 1, n);
    }
    int qry = mst.query();
    if (qry < ans) {
      ans = qry;
      ansk = i;
    }
  }
  cout << ans + 1 << ' ' << ansk;
  return 0;
}
