Exemple #1
0
int main()
{
	/*int n, t;
	cin >> n;
	vector <int> Array(n);
	for (int i = 0; i < n; i++)
	{
		cin >> Array[i];
	}
	FenwickTree* tree = new FenwickTree(Array);
	int m, a, b, c;
	cin >> m;
	for (int i = 0; i < m; i++)
	{
		cin >> a >> b >> c;
		if (a == 1)
			cout << tree->GetSum(b, c) << endl;
		else
			tree->Modify(b, c);
	}*/
	int n, val, answer = 0;
	cin >> n;
	FenwickTree* tree = new FenwickTree(n + 1);
	for (int i = 0; i < n; i++)
	{
		cin >> val;
		answer += tree->GetSum(val + 1, n);
		tree->Modify(val, 1);
	}
	cout << answer;
	return 0;
}
Exemple #2
0
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;
}
Exemple #3
0
//-----------------------------------------------------------------------------
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);
	}
    void divide(int L, int R, int p) {
        if (R-L == 1) {
            ftree.add(1, n-index[L]-p);
        } else {
            int i = L;
            while(i < R) {
                while( index[i]+p >= n ) i++;
                int j = i + 1;
                while(j < R && index[j]+p < n && s[index[i]+p] == s[index[j]+p]) j++;
                ftree.add(j-i,j-i);
//                cout << i << ' ' << j << " pos: "  << p+1 << endl;
                divide(i, j, p+1);
                i = j;
            }
        }

    }
Exemple #6
0
int main (){
	ios::sync_with_stdio(false);
	cin>>n;
	int total=1;
	FenwickTree tree (n+5);
	long long count = 0;
	while(n--) {
		int t;
		cin>>t;
		if (t == 1) {
			int x,a;
			cin>>a>>x;
			tree.add(0,x);
			tree.add(a,-x);
			count += a*x;
		}
		else if (t == 2) {
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;
}
Exemple #8
0
//-----------------------------------------------------------------------------
int calculateTakenPlace(FenwickTree& array_of_sums, int arrive_at_place) {
  if (array_of_sums.at(arrive_at_place) == 0) {
    array_of_sums.add(arrive_at_place, 1);
    return arrive_at_place;
  }
  int occupied_place = -2;
  if (arrive_at_place + 1 < array_of_sums.size()) {
    occupied_place = binarySearchForFreePlace(
            array_of_sums,
            arrive_at_place + 1,
            array_of_sums.size());
  }
  if (occupied_place == -2) {
    occupied_place = binarySearchForFreePlace(
        array_of_sums,
        0,
        arrive_at_place);
  }
  array_of_sums.add(occupied_place, 1);
  return occupied_place;
}
 ll query(int i) {
     return ftree.query(n) - ftree.query(i-1);
 }
Exemple #10
0
 i64 sum(int pos){
   return delta.sum(pos) * pos - delta_i.sum(pos);
 }
Exemple #11
0
 void rangeAfterAdd(int pos, i64 v){
   delta.add(pos, v);
   delta_i.add(pos, v * (pos - 1));
 }