1515#include < unordered_map>
1616#include < unordered_set>
1717
18- #ifdef ALGORITHM_TEST_MACRO
18+ #ifndef ALGORITHM_TEST_MACRO
19+ #pragma GCC optimize(3, "Ofast", "inline", "no-stack-protector", "unroll-loops")
20+ #pragma GCC optimize("inline-small-functions")
21+ #pragma GCC optimize("-finline-small-functions")
22+ #pragma GCC target("mmx")
23+ #else
1924namespace lab_03_E {
2025#endif
2126
@@ -36,34 +41,69 @@ using std::unordered_set;
3641using std::priority_queue;
3742static constexpr const char end{' \n ' };
3843
39- using num_t = int32_t ;
40- using input_type = tuple<num_t , num_t >;
41- using output_type = num_t ;
44+ using i32 = int32_t ;
45+ using i64 = int64_t ;
46+
47+ using input_type = std::pair<i32 , vector<i64 >>;
48+ using output_type = i64 ;
4249
43- inline input_type read ();
50+ inline input_type read_input ();
4451
45- output_type cal (input_type data);
52+ output_type cal (const input_type & data);
4653
4754void output (const output_type &data);
4855
4956int main () {
50- auto input_data = read ();
51- auto output_data = cal (input_data);
57+ const auto input_data = read_input ();
58+ const auto output_data = cal (input_data);
5259 output (output_data);
5360 return 0 ;
5461}
5562
56- inline input_type read () {
57- num_t a{0 }, b{0 };
58- std::cin >> a >> b;
59- return std::make_tuple (a, b);
63+ inline input_type read_input () {
64+ i32 n{0 };
65+ std::cin >> n;
66+ vector<i64 > a;
67+ a.resize (n);
68+ for (i32 i = 0 ; i < n; ++i) std::cin >> a[i];
69+ return {n, a};
6070}
6171
62- output_type cal (input_type data) {
63- num_t a{0 }, b{0 };
64- tie (a, b) = data;
65- num_t c = a + b;
66- return c;
72+ // Fenwick tree for counts
73+ struct Fenwick {
74+ int n;
75+ vector<i32 > bit;
76+ Fenwick (int _n = 0 ) { init (_n); }
77+ void init (int _n) { n = _n; bit.assign (n+1 , 0 ); }
78+ void add (int idx, i32 val) {
79+ for (; idx <= n; idx += idx & -idx) bit[idx] += val;
80+ }
81+ i32 sumPrefix (int idx) const {
82+ i32 r = 0 ;
83+ for (; idx > 0 ; idx -= idx & -idx) r += bit[idx];
84+ return r;
85+ }
86+ };
87+
88+ output_type cal (const input_type &data) {
89+ const i32 n = data.first ;
90+ const auto &a = data.second ;
91+ if (n <= 1 ) return 0 ;
92+ // coordinate compression
93+ vector<i64 > vals = a;
94+ std::sort (vals.begin (), vals.end ());
95+ vals.erase (std::unique (vals.begin (), vals.end ()), vals.end ());
96+ Fenwick fw (static_cast <int >(vals.size ()));
97+ i64 ans = 0 ;
98+ for (i32 i = 0 ; i < n; ++i) {
99+ int rk = static_cast <int >(std::lower_bound (vals.begin (), vals.end (), a[i]) - vals.begin ()) + 1 ; // 1-based
100+ i32 leq = fw.sumPrefix (rk); // number of previous <= a[i]
101+ i32 prev = i; // number of previous elements
102+ i32 greater = prev - leq; // previous elements > a[i]
103+ ans += a[i] * static_cast <i64 >(greater);
104+ fw.add (rk, 1 );
105+ }
106+ return ans;
67107}
68108
69109void output (const output_type &data) {
0 commit comments