Race

 


#include <bits/stdc++.h>
#define N 500000

using namespace std;

int n;
int sz;
int ans[4*N+5];
struct _tuple{
    int org;
    int v;
    int idx;
};
_tuple A[N+5];
vector <int> tree;

bool sf(_tuple a,_tuple b){
    return a.org>b.org;
}

bool sff(_tuple a,_tuple b){
    return a.idx<b.idx;
}

void input(){
    //freopen("in.txt","r",stdin);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>A[i].org;
        A[i].idx=i;
    }
    sort(A+1,A+n+1,sf);
    A[1].v=1;
    for(int i=1;i<n;i++){
        A[i+1].v=A[i].v+1;
    }
    sort(A+1,A+n+1,sff);
}

int s_t(int l, int r){
    int ll=0,rr=0;
    while(l<=r){
        if(l%2==1){
            ll+=tree[l];
            if(l==r){
                break;
            }
            l++;
        }
        l/=2;
        if(r%2==0){
            rr+=tree[r];
            r--;
        }
        r/=2;
    }
    return rr+ll;
}

void pro(){
    int lvl=1;
    while(lvl<n){
        lvl*=2;
    }
    int sz=lvl+n-1;
    for(int i=0;i<sz;i++){
        tree.push_back(0);
    }
    int idx;
    for( int i=1;i<=n;i++){
        idx=lvl+A[i].v-1;
        ans[A[i].idx]=s_t(lvl,idx-1)+1;
        while(idx>=1){
            tree[idx]+=1;
            idx/=2;
        }
    }
    for(int j=1;j<=n;j++){
        cout<<ans[j]<<" ";
    }

}

int main() {
    input();
    pro();
    cout<<endl;
    return 0;
}
+) Solution with indexed set
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
 
using namespace __gnu_pbds;
using namespace std;
 
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
 
 
int n,x;
indexed_set s;

int main() {
    scanf("%d",&n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &x);
        cout << i - s.order_of_key(x) + 1 << "\n";
        s.insert(x);
    }
    return 0;
}

Comments