Untitled

 avatar
user_5668965
c_cpp
a year ago
1.7 kB
8
Indexable
#include<bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define int long long
struct BIT {
    vector<int> bit;  // binary indexed tree
    int n;

    BIT(int n) {
        this->n = n;
        bit.assign(n, 0);
    }

    BIT(vector<int> a) : BIT(a.size()) {
        for (size_t i = 0; i < a.size(); i++)
            add(i, a[i]);
    }

    int sum(int r) {
        int ret = 0;
        for (; r >= 0; r = (r & (r + 1)) - 1)
            ret += bit[r];
        return ret;
    }

    int sum(int l, int r) {
        return sum(r) - sum(l - 1);
    }

    void add(int idx, int delta) {
        for (; idx < n; idx = idx | (idx + 1))
            bit[idx] += delta;
    }
};

void solve(){
    int n;
    cin>>n;
    int a[n]={};
    set<int> st;
    for(int i=0;i<n;i++) cin>>a[i],st.insert(a[i]);
    int cnt=1;
    map<int,int> mapi;
    for(auto &it:st){
        mapi[it]=cnt++;
    }
    for(int i=0;i<n;i++) a[i]=mapi[a[i]];
    int lefti[n]={};
    BIT b1(cnt+5);
    for(int i=n-1;i>=0;i--){
        lefti[i]=b1.sum(a[i]-1);
        b1.add(a[i],1);
    }
    reverse(a,a+n);
    int righti[n]={};
    BIT b2(cnt+5);
    for(int i=n-1;i>=0;i--){
        righti[i]=b2.sum(a[i]+1,cnt+3);
        b2.add(a[i],1);
    }
    reverse(righti,righti+n);
    int ans=0;
    for(int i=0;i<n;i++){
        ans+=(lefti[i]*righti[i]);
    }
    cout<<ans<<'\n';

}


signed main() {
    #ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
  fast
  int t=1;
  //cin>>t;
  while(t--)
    solve();
  return 0;
}
Editor is loading...
Leave a Comment