#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 5000+5
#define DEBUG 1
int C[N] = {0};
int A[N] = {0};
int lowbit(int x){
return x&(-x);
}
int getsum(int x,int n){
int ans = 0;
while(x>0){
ans+=C[x];
x -= lowbit(x);
}
return ans;
}
void update(int x,int value,int n){
while(x<=n){
C[x]+=value;
x+=lowbit(x);
}
}
int main()
{
if(DEBUG)
freopen("data.txt","r",stdin);
int n;
while(cin>> n){
memset(C,0,sizeof(C));
memset(A,0,sizeof(A));
//求一个序列的逆序对时
//将C[N] 数组假设为此时已有的整数
// 每次向C[N]插入一个数字时,只需计算
//此时后面有多少个位置有多少个数字。即是
//在此数字的顺序前,且比它大的,
//故应该 sum[n]-sum[Ai]
int inver_num = 0;
for(int i=1;i<=n;i++){
cin>>A[i];
//因为树状数组从1开始故遇到有零的情况应该
//将所有数字映射到 >0
A[i] +=1;
//C[A[i]]+=1;
//每次有新的输入记得UPDATE C数组中的值。
update(A[i],1,n);
inver_num += (getsum(n,n) - getsum(A[i],n));
}
int min_inver_num = inver_num;
//此时已算出一个序列的全部逆序对个数
//再每次将最前面的数字移到末尾,求得新序列的逆序对
//将最前面的数字移到最后面,意味着现在要将这个数最后
//一个插入进去,所以它后面的数都会成为逆序对。
//故应该 + (sum[N] - sum[Ai])
//又因为它是第一个放进去的,所以它只会影响序列在它之前的
//故也要 - (sum[Ai]-1)
for(int i=1;i<n;i++){
inver_num += (getsum(n,n)-getsum(A[i],n) - (getsum(A[i],n) -1) );
min_inver_num = min(inver_num,min_inver_num);
}
cout<<min_inver_num<<endl;
}
//cout << "Hello world!" << endl;
return 0;
}