Josif_tepe

Untitled

Nov 9th, 2025
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. typedef long long ll;
  5. const int maxn = 1000005;
  6.  
  7. int segment_tree[3 * maxn];
  8.  
  9. int merge_nodes(int A, int B) {
  10.     return A + B;
  11. }
  12. void build_tree(int L, int R, int node) {
  13.     if(L == R) {
  14.         segment_tree[node] = 0;
  15.         return;
  16.     }
  17.    
  18.     int middle = (L + R) / 2;
  19.     build_tree(L, middle, 2 * node);
  20.     build_tree(middle + 1, R, 2 * node + 1);
  21.     segment_tree[node] = merge_nodes(segment_tree[2 * node], segment_tree[2 * node + 1]);
  22. }
  23.  
  24. // L R i L R j L R
  25. int query(int i, int j, int L, int R, int node) {
  26.     if(i <= L and R <= j) {
  27.         return segment_tree[node];
  28.     }
  29.     if(R < i or j < L) {
  30.         return 0;
  31.     }
  32.    
  33.     int middle = (L + R) / 2;
  34.     return merge_nodes(query(i, j, L, middle, 2 * node), query(i, j, middle + 1, R, 2 * node + 1));
  35.    
  36. }
  37. void update(int idx, int new_value, int L, int R, int node) {
  38.     if(L == R) {
  39.         segment_tree[node] = new_value;
  40.         return;
  41.     }
  42.     int middle = (L + R) / 2;
  43.    
  44.     if(idx <= middle) {
  45.         update(idx, new_value, L, middle, 2 * node);
  46.     }
  47.     else {
  48.         update(idx, new_value, middle + 1, R, 2 * node + 1);
  49.     }
  50.    
  51.     segment_tree[node] = merge_nodes(segment_tree[2 * node], segment_tree[2 * node + 1]);
  52.    
  53. }
  54. int main() {
  55.     ios_base::sync_with_stdio(false);
  56.     int n;
  57.     cin >> n;
  58.    
  59.     vector<int> v(n);
  60.     for(int i = 0; i < n; i++) {
  61.         cin >> v[i];
  62.     }
  63.    
  64.     build_tree(0, n, 1);
  65.     ll res = 0;
  66.    
  67.     for(int i = n - 1; i >= 0; i--) {
  68.         update(v[i], 1, 0, n, 1);
  69.         res += query(0, v[i] - 1, 0, n, 1);
  70.     }
  71.     cout << res << endl;
  72.  
  73.     return 0;
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment