#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1e5+5;
struct data{
int val,id;
bool operator <(const data &h)const{
return val == h.val ? id < h.id : val < h.val;
}
}arr[maxn];
int brr[maxn];
int tree[maxn];
int lowbit(int x){
return x & -x;
}
void update(int i,int k,int n){
while(i <= n){
tree[i] += k;
i += lowbit(i);
}
}
int getsum(int i){
int res = 0;
while(i > 0){
res += tree[i];
i -= lowbit(i);
}
return res;
}
vector<int> vec;
int getid(int x){
return lower_bound(vec.begin(),vec.end(),x) - vec.begin() + 1;
}
int main()
{
int n; cin >> n;
for(int i = 1; i <= n; ++i){
cin >> arr[i].val,arr[i].id = i;
vec.push_back(arr[i].val);
}
sort(arr+1,arr+1+n);
sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(),vec.end()),vec.end());
for(int i = 1; i <= n; ++i){
brr[arr[i].id] = getid(arr[i].val);
}
int sum = 0;
for(int i = 1; i <= n; ++i){
update(brr[i],1,n);
if(i>1) cout << ' ';
cout << i-getsum(brr[i]);
}
cout << endl;
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 5e5+5;
int n,arr[maxn],crr[maxn];
long long ans = 0;
int merge_sort(int l,int r){
if(l==r) return 0;
int mid = l + r >> 1;
merge_sort(l,mid); merge_sort(mid+1,r);
int i = l,j = mid+1,k = l;
while(i <= mid && j <= r){
if(arr[i] <= arr[j])
crr[k++] = arr[i++];
else crr[k++] = arr[j++],ans += mid - i + 1;
}
while(i<=mid)
crr[k++] = arr[i++];
while(j<=r)
crr[k++] = arr[j++];
for(int q = l; q <= r; ++q){
arr[q] = crr[q];
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; ++i){
cin >> arr[i];
}
merge_sort(1,n);
cout << ans << endl;
return 0;
}