#include <bits/stdc++.h>
#define F first
#define S second
#define X real()
#define Y imag()
using namespace std;
typedef long long ll;
typedef long double ld;
pair<int,int> re[201010];
int re2[201010];
int xx[201010];
int INF = 999999;
const int N = 1<<18;
ll sTr[3][2*N];
ll cntr[5];
void change(int ind, ll am, int a) {
ind += N;
while (ind > 0) {
sTr[a][ind]+=am;
ind /= 2;
}
}
ll query(int a, int lo, int hi) {
lo += N;
hi += N;
ll res = 0;
while (lo <= hi) {
if (lo%2 == 1) res += sTr[a][lo++];
if (hi%2 == 0) res += sTr[a][hi--];
lo /= 2;
hi /= 2;
}
return res;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
for (int i=0;i<n;i++) {
int j;
cin>>j;
re[i]= {j,i};
re2[i]=j;
}
sort(re,re+n);
for (int i=0;i<n;i++) xx[i]=re[i].S;
int parsa=INF;
int paCnt=0;
for (int i=0;i+1<n;i++) {
if (xx[i]>xx[i+1]) paCnt++;
}
ll parsacnt=0;
for (int i=0;i+2<n;i++) {
int tst=paCnt;
if (i>0) {
if (xx[i-1]>xx[i] && xx[i-1]<xx[n-1]) tst--;
if (xx[i-1]<xx[i] && xx[i-1]>xx[n-1]) tst++;
}
if (xx[i]>xx[i+1] && xx[n-1]<xx[i+1]) tst--;
if (xx[i]<xx[i+1] && xx[n-1]>xx[i+1]) tst++;
if (xx[n-2]>xx[n-1] && xx[n-2]<xx[i]) tst--;
if (xx[n-2]<xx[n-1] && xx[n-2]>xx[i]) tst++;
if (tst < parsa) {
parsa = tst;
parsacnt = 1;
} else if (tst == parsa) parsacnt++;
}
for (int i=2;i+1<n;i++) {
int tst=paCnt;
if (xx[i]>xx[i+1] && xx[0]<xx[i+1]) tst--;
if (xx[i]<xx[i+1] && xx[0]>xx[i+1]) tst++;
if (xx[0]>xx[1] && xx[i]<xx[1]) tst--;
if (xx[0]<xx[1] && xx[i]>xx[1]) tst++;
if (xx[i-1]>xx[i] && xx[i-1]<xx[0]) tst--;
if (xx[i-1]<xx[i] && xx[i-1]>xx[0]) tst++;
if (tst < parsa) {
parsa = tst;
parsacnt = 1;
} else if (tst == parsa) parsacnt++;
}
for (int i=0;i+1<n;i++) {
int tst=paCnt;
if (i>0) {
if (xx[i-1]>xx[i] && xx[i-1]<xx[i+1]) tst--;
if (xx[i-1]<xx[i] && xx[i-1]>xx[i+1]) tst++;
}
if (i+2<n) {
if (xx[i+1]>xx[i+2] && xx[i]<xx[i+2]) tst--;
if (xx[i+1]<xx[i+2] && xx[i]>xx[i+2]) tst++;
}
if (xx[i]>xx[i+1]) tst--;
else tst++;
if (tst < parsa) {
parsa = tst;
parsacnt = 1;
} else if (tst == parsa) parsacnt++;
}
vector<pair<int,pair<int,int>>> act,deact;
for (int j=1;j<n-1;j++) {
if (xx[j-1]<xx[j]) {
if (xx[j]<xx[j+1]) {
if (0<xx[j-1]) {
act.push_back({0,{2,j}});
deact.push_back({xx[j-1],{2,j}});
}
if (xx[j-1]+1 < xx[j]) {
act.push_back({xx[j-1]+1,{1,j}});
deact.push_back({xx[j],{1,j}});
}
} else {
if (xx[j-1]<xx[j+1]) {
if (0<xx[j-1]) {
act.push_back({0,{1,j}});
deact.push_back({xx[j-1],{1,j}});
}
if (xx[j-1]+1<xx[j+1]) {
act.push_back({xx[j-1]+1,{0,j}});
deact.push_back({xx[j+1],{0,j}});
}
if (xx[j+1]+1<xx[j]) {
act.push_back({xx[j+1]+1,{1,j}});
deact.push_back({xx[j],{1,j}});
}
} else {
if (0<xx[j+1]) {
act.push_back({0,{1,j}});
deact.push_back({xx[j+1],{1,j}});
}
if (xx[j+1]+1<xx[j-1]) {
act.push_back({xx[j+1]+1,{2,j}});
deact.push_back({xx[j-1],{2,j}});
}
if (xx[j-1]+1<xx[j]) {
act.push_back({xx[j-1]+1,{1,j}});
deact.push_back({xx[j],{1,j}});
}
}
}
} else {
if (xx[j]>xx[j+1]) {
if (0<xx[j+1]) {
act.push_back({0,{0,j}});
deact.push_back({xx[j+1],{0,j}});
}
if (xx[j+1]+1<xx[j]) {
act.push_back({xx[j+1]+1,{1,j}});
deact.push_back({xx[j],{1,j}});
}
} else {
if (0<xx[j]) {
act.push_back({0,{1,j}});
deact.push_back({xx[j],{1,j}});
}
}
}
}
sort(act.begin(),act.end());
sort(deact.begin(),deact.end());
int kk = act.size();
int ptr1 = 0;
int ptr2 = 0;
for (int i = 0; i<n; i++) {
while (ptr1 < kk && act[ptr1].F<=i) {
change(xx[act[ptr1].S.S],1,act[ptr1].S.F);
ptr1++;
}
while (ptr2 < kk && deact[ptr2].F<=i) {
change(xx[deact[ptr2].S.S],-1,deact[ptr2].S.F);
ptr2++;
}
int j = re2[i];
j--;
if (j==0 || j==n-1) continue;
if (xx[j-1]<xx[j] && xx[j]<xx[j+1]) {
// cerr<<"1: ";
for (int a=0;a<=2;a++) {
cntr[1+a]+=query(a,xx[j]+1,xx[j+1]-1);
cntr[2+a]+=query(a,xx[j+1]+1,n-1);
}
} else if (xx[j-1]<xx[j+1] && xx[j+1]<xx[j]) {
// cerr<<"2: ";
for (int a=0;a<=2;a++) {
cntr[1+a]+=query(a,xx[j]+1,n-1);
}
} else if (xx[j]<xx[j-1] && xx[j-1]<xx[j+1]) {
// cerr<<"3: ";
for (int a=0;a<=2;a++) {
cntr[1+a]+=query(a,xx[j]+1,xx[j-1]-1);
cntr[a]+=query(a,xx[j-1]+1,xx[j+1]-1);
cntr[1+a]+=query(a,xx[j+1]+1,n-1);
}
} else if (xx[j]<xx[j+1] && xx[j+1]<xx[j-1]) {
// cerr<<"4: ";
for (int a=0;a<=2;a++) {
cntr[1+a]+=query(a,xx[j]+1,xx[j+1]-1);
cntr[2+a]+=query(a,xx[j+1]+1,xx[j-1]-1);
cntr[1+a]+=query(a,xx[j-1]+1,n-1);
}
} else if (xx[j+1]<xx[j] && xx[j]<xx[j-1]) {
// cerr<<"5: ";
for (int a=0;a<=2;a++) {
cntr[1+a]+=query(a,xx[j]+1,xx[j-1]-1);
cntr[a]+=query(a,xx[j-1]+1,n-1);
}
} else {
// cerr<<"6: ";
for (int a=0;a<=2;a++) {
cntr[1+a]+=query(a,xx[j]+1,n-1);
}
}
// cerr<<j<<" "<<xx[j-1]<<" "<<xx[j]<<" "<<xx[j+1]<<endl;
// for (int a = 0; a<=4;a++) cerr<<cntr[a]<<" ";
// cerr<<endl;
}
for (int i=0;i<=4;i++) {
if (cntr[i]>0 && paCnt-2+i < parsa) {
cout<<paCnt-1+i<<" "<<cntr[i]<<"\n";
return 0;
} else if (paCnt-2+i == parsa) {
cout << parsa+1 << " " <<parsacnt+cntr[i]<<"\n";
return 0;
}
}
}