structBIT { /* ================================================== */ ll tr[maxn]; int sz; voidinit( int N ){ sz = N; fill( tr, tr + sz + 1, 0 ); } voidadd( int idx, ll val ){ for( int i = idx; i <= sz; i += i & -i ) tr[i] += val; } // 单点修改 a[idx] += val ll ask( int idx ){ ll res = 0; for( int i = idx; i; i -= i & -i ) res += tr[i]; return res; } // 查询前缀和 [1, idx] ll ask( int l, int r ){ returnask( r ) - ask( l - 1 ); } // 查询区间和 [l, r] /* ================================================== */ } bit;
int a[maxn], L[maxn], R[maxn];
voidsolve( ){ int n = read( ); int mx = -1; for( int i = 1; i <= n; ++ i ) { a[i] = read( ); mx = max( mx, a[i] ); }
bit.init( mx ); for( int i = 1; i <= n; ++ i ) { L[i] = bit.ask( 1, a[i] - 1 ); bit.add( a[i], 1 ); }
bit.init( mx ); for( int i = n; i; -- i ) { R[i] = bit.ask( a[i] + 1, mx ); bit.add( a[i], 1 ); }
ll ans = 0; for( int i = 1; i <= n; ++ i ) { ans += L[i] * R[i]; } cout << ans << '\n'; }