#include<iostream> #include<string.h> #include<cstdio> #include<algorithm> #define N 5005 #define L(x)(x<<1) #define R(x) (x<<1|1) #define M(x,y) ((x+y)>>1) using namespace std; typedef struct str { int l; int r; int key; }Node; Node node[N<<1]; int value[N]; void bulid(int t,int l,int r) { node[t].l=l; node[t].r=r; node[t].key=0; if(l==r-1)return ; int mid=M(l,r); bulid(L(t),l,mid); bulid(R(t),mid,r); } void update(int t,int a) { node[t].key++; if(node[t].l==(node[t].r-1)) return; int mid=M(node[t].l,node[t].r); if(a>=mid) update(R(t),a); else update(L(t),a); } int Quary(int t,int a,int b) { if(node[t].l==a&&node[t].r==b) return node[t].key; int mid=M(node[t].l,node[t].r); if(a>=mid) return Quary(R(t),a,b); else { if(b<=mid) return Quary(L(t),a,b); else return Quary(L(t),a,mid)+Quary(R(t),mid,b); } } int main() { int n; while(~scanf("%d",&n)) { int sum=0; bulid(1,0,n); for(int i=1;i<=n;++i) { scanf("%d",&value[i]); sum+=Quary(1,value[i],n); update(1,value[i]); } int k=sum; for(int i=n;i>=2;--i) { sum=sum+value[i]-(n-1-value[i]); if(sum<k) k=sum; } printf("%d\n",k); }return 0; }