#include <bits/stdc++.h>
using namespace std;
int n, p[400005], onepos, depth[200005];
struct vnode {
  int second, e, m;
  pair<int, int> v;
  vnode *l, *r;
  vnode(int S, int E) {
    second = S, e = E, m = (second + e) / 2;
    if (second == e)
      v = pair<int, int>(p[second], second);
    else {
      l = new vnode(second, m);
      r = new vnode(m + 1, e);
      v = min(l->v, r->v);
    }
  }
  pair<int, int> query(int x, int y) {
    if (second == x and e == y)
      return v;
    else if (y <= m)
      return l->query(x, y);
    else if (x > m)
      return r->query(x, y);
    else
      return min(l->query(x, m), r->query(m + 1, y));
  }
} * vseg;
void dfs(int x, int y, int d) {
  if (x > y) return;
  pair<int, int> m = vseg->query(x, y);
  depth[m.first] = d;
  dfs(x, m.second - 1, d + 1);
  dfs(m.second + 1, y, d + 1);
}
struct node {
  int second, e, m, v, mv, add;
  node *l, *r;
  node(int S, int E) {
    second = S, e = E, m = (second + e) / 2, v = 0, mv = 0, add = 0;
    if (second == e) {
      if (second <= n) v = mv = depth[p[second]];
    } else {
      l = new node(second, m);
      r = new node(m + 1, e);
      v = min(l->v, r->v);
      mv = max(l->mv, r->mv);
    }
  }
  pair<int, int> value() {
    v += add;
    mv += add;
    if (second != e) {
      l->add += add;
      r->add += add;
    }
    add = 0;
    return pair<int, int>(v, mv);
  }
  void up(int x, int y, int nv) {
    if (second == x and e == y) {
      add += nv;
      return;
    } else if (y <= m)
      l->up(x, y, nv);
    else if (x > m)
      r->up(x, y, nv);
    else
      l->up(x, m, nv), r->up(m + 1, y, nv);
    v = min(l->value().first, r->value().first);
    mv = max(l->value().second, r->value().second);
  }
  int query(int x, int y, bool small) {
    value();
    if (second == x and e == y)
      return (small ? v : mv);
    else if (y <= m)
      return l->query(x, y, small);
    else if (x > m)
      return r->query(x, y, small);
    else {
      int le = l->query(x, m, small), ri = r->query(m + 1, y, small);
      return (small ? min(le, ri) : max(le, ri));
    }
  }
} * seg;
int main() {
  cin >> n;
  for (int i = (int)1; i <= (int)n; i++) {
    cin >> p[i];
    if (p[i] == 1) onepos = i;
  }
  rotate(p + 1, p + onepos + 1, p + n + 1);
  for (int i = (int)1; i <= (int)n; i++) p[n + i] = p[i];
  vseg = new vnode(1, 2 * n);
  dfs(1, n, 1);
  seg = new node(1, 2 * n);
  pair<int, int> ans = pair<int, int>(seg->query(1, n, 0), onepos);
  for (int i = (int)0; i <= (int)n - 2; i++) {
    int x = p[i + 1];
    int lower = i + 1, upper = n + i;
    while (upper - lower > 1) {
      int mid = (lower + upper) / 2;
      pair<int, int> val = vseg->query(lower + 1, mid);
      if (val.first < x)
        upper = val.second;
      else
        lower = mid;
    }
    seg->up(i + 1, upper - 1, -1);
    lower = i + 1, upper = n + i + 1;
    while (upper - lower > 1) {
      int mid = (upper + lower) / 2;
      pair<int, int> val = vseg->query(mid, upper - 1);
      if (val.first < x)
        lower = val.second;
      else
        upper = mid;
    }
    seg->up(i + n + 1, i + n + 1, seg->query(lower, lower, 1));
    seg->up(lower + 1, i + n + 1, 1);
    ans = min(ans,
              pair<int, int>(seg->query(i + 2, i + n + 1, 0), i + onepos + 1));
  }
  cout << ans.first << " " << ans.second % n;
}
