//----------------------------------------------------------------------------- int binarySearchForFreePlace( const FenwickTree& array_of_sums, int left_border, int right_border) { // Left border inclusive, Right border not inclusive if (right_border == 0 || array_of_sums.sum(left_border, right_border - 1) == right_border - left_border) { return -2; // Later -2 + 1 -> -1 } while (right_border - left_border > 1) { int middle = left_border + (right_border - left_border) / 2; if (array_of_sums.sum(middle, right_border - 1) == right_border - middle) { right_border = middle; continue; } if (array_of_sums.sum(left_border, middle - 1) == middle - left_border) { left_border = middle; continue; } right_border = middle; } return left_border; }
rep(v, n) { int d = v + 1 - s, u = 0; if(d > 0) { int i = cnt.find(d); u = tot.sum(i) + (d - cnt.sum(i)) * (i + 1); } ans = min(ans, t + u); for(auto x : ord[v]) s--, t -= x, cnt.add(x, 1), tot.add(x, x); }
int main(int argc, char *argv[]) { int A[MAXN + 16]; vector<int> AA; for (int i = 1; i <= MAXN; i++) { A[i] = i; AA.push_back(i); } FenwickTree ft; ft.prepare(AA); for (int i = 1; i <= MAXN; i++) add(i, A[i]); for (int cases = 1; cases <= 100; cases++) { int L = rand() % MAXN + 1, R = rand() % MAXN + 1; if (L > R) swap(L, R); cout << "S[" << setw(4) << right << L << ", "; cout << setw(4) << right << R << "] => "; cout << get(R) - get(L - 1) << " = "; cout << ft.sum(L - 1, R - 1); cout << " = " << (R + L) * (R - L + 1) / 2 << '\n'; } return 0; }
int main () { size_t n; cin >> n; FenwickTree tr (n); int res = 0; for (size_t i = 0; i < n; ++i) { int cur; cin >> cur; tr.modify (cur - 1, 1); res += tr.sum (cur, n - 1); } cout << res; return 0; }
i64 sum(int pos){ return delta.sum(pos) * pos - delta_i.sum(pos); }