1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6
7 const int maxn=500500;
8 int n;
9 int aa[maxn];//离散后
10 int c[maxn];//树状数组
11
12 struct Node
13 {
14 int v;
15 int order;
16 } in[maxn];
17
18 int lowbit(int x)
19 {
20 return x&(-x);
21 }
22
23 void update(int t,int value)//在t单点更新value
24 {
25 int i;
26 for(i=t;i<=n;i+=lowbit(i))
27 {
28 c[i]+=value;
29 }
30 }
31
32 int getsum(int x)
33 {
34 int i;
35 int temp=0;
36 for(i=x;i>=1;i-=lowbit(i))
37 {
38 temp+=c[i];
39 }
40 return temp;
41 }
42
43 bool cmp(Node a,Node b)
44 {
45 return a.v<b.v;
46 }
47
48 int main()
49 {
50 int i,j;
51 while(scanf("%d",&n)==1&&n)
52 {
53 //以防数据太大,先离散化,离散其实就是看in[i].v排第几位
54 for(i=1;i<=n;i++)
55 {
56 scanf("%d",&in[i].v);
57 in[i].order=i;
58 }
59
60 sort(in+1,in+n+1,cmp);
61 for(i=1;i<=n;i++)
62 aa[in[i].order]=i;//原来in中下标为in[i].order排在第i位(因为排序了),对应的值就是i
63 memset(c,0,sizeof(c));
64 long long ans=0;
65 for(i=1;i<=n;i++)
66 {
67 update(aa[i],1);//在aa[i]位置更新值1
68 ans+=i-getsum(aa[i]);
69 }
70 cout<<ans<<endl;
71 }
72 return 0;
73 }