#include <bits/stdc++.h>
using namespace std;
int n;
int num[400005];
pair<int, int> min(pair<int, int> a, pair<int, int> b) {
  if (a.first <= b.first)
    return a;
  else
    return b;
}
int lmn[400005][19], rmn[400005][19];
int leftMin(int i) {
  int p = i;
  for (int j = (18); j >= (0); j--) {
    int tp = p - (1 << j);
    if (tp >= max(0, i - n) && lmn[p][j] >= num[i]) p = tp;
  }
  return p;
}
int rightMin(int i) {
  int p = i;
  for (int j = (18); j >= (0); j--) {
    int tp = p + (1 << j);
    if (tp <= i + n && rmn[p][j] >= num[i]) p = tp;
  }
  return p;
}
template <typename T, typename T2>
class segmentTree {
 public:
  vector<T> seg;
  vector<T2> lazy;
  int mxs;
  T sfill;
  T2 lfill;
  int ql, qr;
  T2 qv;
  segmentTree(int _mxs, T _sfill, T2 _lfill) : sfill(_sfill), lfill(_lfill) {
    for (mxs = 1; mxs < _mxs; mxs <<= 1)
      ;
    seg.assign((mxs << 1) + 5, sfill);
    lazy.assign((mxs << 1) + 5, lfill);
  }
  T combine(T a, T b) { return max(a, b); }
  void ppt(int i, int l, int r) {
    if (lazy[i] == lfill) return;
    seg[i] += lazy[i];
    if (i < mxs) {
      lazy[i << 1] += lazy[i];
      lazy[i << 1 | 1] += lazy[i];
    }
    lazy[i] = lfill;
  }
  void merge(int i) { seg[i] = combine(seg[i << 1], seg[i << 1 | 1]); }
  T query(int l, int r, int i) {
    ppt(i, l, r);
    if (qr < l || r < ql) return sfill;
    if (ql <= l && r <= qr) return seg[i];
    int m = (l + r) >> 1;
    T lft = query(l, m, i << 1);
    T rgt = query(m + 1, r, i << 1 | 1);
    merge(i);
    return combine(lft, rgt);
  }
  T qry(int _ql, int _qr) {
    ql = _ql;
    qr = _qr;
    return query(1, mxs, 1);
  }
  void update(int l, int r, int i) {
    ppt(i, l, r);
    if (qr < l || r < ql) return;
    if (ql <= l && r <= qr) {
      lazy[i] += qv;
      ppt(i, l, r);
      return;
    }
    int m = (l + r) >> 1;
    update(l, m, i << 1);
    update(m + 1, r, i << 1 | 1);
    return merge(i);
  }
  void upd(int _ql, int _qr, T2 _qv) {
    ql = _ql;
    qr = _qr;
    qv = _qv;
    update(1, mxs, 1);
  }
};
segmentTree<int, int> s(400000, 0, 0);
void remove(int i) {
  int p = rightMin(i);
  s.upd(i + 1, p - 1, -1);
  s.upd(i, i, -s.qry(i, i));
}
void insert(int i) {
  int p = leftMin(i);
  int dh = (p == max(0, i - n) ? 0 : s.qry(p, p)) + 1;
  s.upd(i, i, dh);
  s.upd(p + 1, i - 1, 1);
}
int main() {
  scanf("%d", &n);
  for (int i = (1); i <= (n); i++) {
    scanf("%d", &num[i]);
    num[i + n] = num[i];
  }
  for (int i = (1); i <= (n + n); i++) lmn[i][0] = rmn[i][0] = num[i];
  for (int j = (1); j <= (18); j++) {
    for (int i = (1); i <= (n + n); i++) {
      lmn[i][j] = lmn[i][j - 1];
      int p = i - (1 << (j - 1));
      if (p >= 1) {
        lmn[i][j] = min(lmn[i][j], lmn[p][j - 1]);
      }
      rmn[i][j] = rmn[i][j - 1];
      p = i + (1 << (j - 1));
      if (p <= n + n) {
        rmn[i][j] = min(rmn[i][j], rmn[p][j - 1]);
      }
    }
  }
  pair<int, int> ans = {1000000000, 0};
  for (int i = (1); i <= (n + n - 1); i++) {
    if (i > n) remove(i - n);
    insert(i);
    if (i >= n) ans = min(ans, {s.seg[1], i - n});
  }
  printf("%d %d\n", ans.first, ans.second);
  return 0;
}
