1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 5 using namespace std ; 6 7 const int N = 100010 ; 8 9 struct node{ 10 int val,pos ; 11 }tmp[N]; 12 int a[N] ;//离散化后的原始数组 13 int c[N] ;//树状数组 14 15 16 bool cmp(node st1,node st2){ 17 return st1.val < st2.val ; 18 } 19 20 int lowbit(int x){//取得最右边的一个1 21 return x&(-x) ; 22 } 23 24 int getSum(int x){//区间1~x的和 log(N) 25 int sum = 0 ; 26 for(int i=x;i>0;i-=lowbit(i)){ 27 sum += c[i] ; 28 } 29 return sum ; 30 } 31 32 void update(int x,int v){//单点更新 log(N) 33 for(int i=x;i<=N;i+=lowbit(i)){ 34 c[i] += v ; 35 } 36 } 37 38 39 int main(){ 40 int n, x ; 41 cin >> n ; 42 43 memset(c,0,sizeof c) ; 44 45 for(int i=0;i<n;i++){ 46 cin >> tmp[i].val ; 47 tmp[i].pos = i ; 48 } 49 50 sort(tmp,tmp+n,cmp) ; 51 52 for(int i=0;i<n;i++){ 53 if(i==0 || tmp[i-1].val != tmp[i].val) 54 a[tmp[i].pos] = i + 1 ;//离散化 55 else{ 56 a[tmp[i].pos] = a[tmp[i-1].pos] ; 57 } 58 } 59 60 for(int i=0;i<n;i++){ 61 update(a[i],1) ; 62 cout << getSum(a[i]-1) << endl ; 63 } 64 65 return 0 ; 66 67 }