#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
const long long maxn = 4e5 + 5, N = 1e6 + 20, SQ = 450, base = 800287,
                mod = 1e9 + 7, INF = 1e18 + 5, lg = 20;
const long double eps = 1e-4;
struct node {
  long long mx, lazy;
};
stack<long long> st;
node seg[4 * maxn];
long long n, a[maxn], L[maxn], R[maxn];
void build(long long v = 1, long long s = 0, long long e = 2 * n) {
  if (e - s == 1) {
    long long x = (s < n ? 0 : -INF);
    seg[v].mx = x;
    seg[v].lazy = 0;
    return;
  }
  build(2 * v, s, (s + e) / 2);
  build(2 * v + 1, (s + e) / 2, e);
  seg[v].lazy = 0;
  seg[v].mx = max(seg[2 * v].mx, seg[2 * v + 1].mx);
}
void find_L() {
  for (long long i = 0; i < 2 * n; ++i) {
    while ((long long)st.size() && a[st.top()] > a[i]) {
      st.pop();
    }
    L[i] = ((long long)st.size() ? st.top() : -1);
    st.push(i);
  }
  while ((long long)st.size()) {
    st.pop();
  }
}
void find_R() {
  for (long long i = 2 * n - 1; i >= 0; --i) {
    while ((long long)st.size() && a[st.top()] > a[i]) {
      st.pop();
    }
    R[i] = ((long long)st.size() ? st.top() : 2 * n);
    st.push(i);
  }
  while ((long long)st.size()) {
    st.pop();
  }
}
inline void shift(long long v) {
  seg[2 * v].mx += seg[v].lazy;
  seg[2 * v + 1].mx += seg[v].lazy;
  seg[2 * v].lazy += seg[v].lazy;
  seg[2 * v + 1].lazy += seg[v].lazy;
  seg[v].lazy = 0;
}
void add(long long l, long long r, long long x, long long v = 1,
         long long s = 0, long long e = 2 * n) {
  if (l >= e || s >= r) {
    return;
  }
  if (l <= s && e <= r) {
    seg[v].mx += x;
    seg[v].lazy += x;
    return;
  }
  shift(v);
  add(l, r, x, 2 * v, s, (s + e) / 2);
  add(l, r, x, 2 * v + 1, (s + e) / 2, e);
  seg[v].mx = max(seg[2 * v].mx, seg[2 * v + 1].mx);
}
void modify(long long p, long long x, long long v = 1, long long s = 0,
            long long e = 2 * n) {
  if (e - s == 1) {
    seg[v].mx = x;
    return;
  }
  shift(v);
  if (p < (s + e) / 2) {
    modify(p, x, 2 * v, s, (s + e) / 2);
  } else {
    modify(p, x, 2 * v + 1, (s + e) / 2, e);
  }
  seg[v].mx = max(seg[2 * v].mx, seg[2 * v + 1].mx);
}
long long get(long long p, long long v = 1, long long s = 0,
              long long e = 2 * n) {
  if (e - s == 1) {
    return seg[v].mx;
  }
  shift(v);
  long long res;
  if (p < (s + e) / 2) {
    res = get(p, 2 * v, s, (s + e) / 2);
  } else {
    res = get(p, 2 * v + 1, (s + e) / 2, e);
  }
  seg[v].mx = max(seg[2 * v].mx, seg[2 * v + 1].mx);
  return res;
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (long long i = 0; i < n; ++i) {
    cin >> a[i];
    a[i + n] = a[i];
  }
  build();
  find_L();
  find_R();
  for (long long i = 0; i < n; ++i) {
    add(L[i] + 1, i, 1);
    add(i + 1, R[i], 1);
  }
  long long res = INF, id = -1;
  for (long long i = 0; i < n; ++i) {
    if (seg[1].mx < res) {
      res = seg[1].mx;
      id = i;
    }
    long long val = (L[i + n] <= i ? 0 : get(L[i + n]) + 1);
    add(i + 1, R[i], -1);
    add(L[i + n] + 1, i + n, 1);
    modify(i, -INF), modify(i + n, val);
  }
  cout << res + 1 << ' ' << id << '\n';
}
