Advertisement
TimSenin

Untitled

Oct 18th, 2022
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. struct Node {
  4.     Node(int left, int right) : left_bound(left), right_bound(right) {}
  5.  
  6.     Node* left_son = nullptr;
  7.     Node* right_son = nullptr;
  8.     int left_bound = 0;
  9.     int right_bound = 0;
  10.     int sum = 0;
  11. };
  12.  
  13. Node* MakeNode(int left, int right) {  // ДО индексируется с 1
  14.     Node* node = new Node(left, right);
  15.     if (left != right) {
  16.         int middle = (left + right) / 2;
  17.         node->left_son = MakeNode(left, middle);
  18.         node->right_son = MakeNode(middle + 1, right);
  19.         node->sum = node->left_son->sum + node->right_son->sum;
  20.     } else {
  21.         node->sum = 0;
  22.     }
  23.     return node;
  24. }
  25.  
  26. Node* set(Node* node, int position, int new_value) {
  27.     if (node->left_son) {
  28.         if (position <= node->left_son->right_bound) {
  29.             Node* new_node = new Node(position, position);
  30.             new_node->right_son = node->right_son;
  31.             new_node->left_son = set(node->left_son, position, new_value);
  32.             new_node->sum = new_node->right_son->sum + new_node->left_son->sum;
  33.             new_node->left_bound = node->left_bound;
  34.             new_node->right_bound = node->right_bound;
  35.             return new_node;
  36.         } else {
  37.             Node* new_node = new Node(position, position);
  38.             new_node->left_son = node->left_son;
  39.             new_node->right_son = set(node->right_son, position, new_value);
  40.             new_node->sum = new_node->left_son->sum + new_node->right_son->sum;
  41.             new_node->left_bound = node->left_bound;
  42.             new_node->right_bound = node->right_bound;
  43.             return new_node;
  44.         }
  45.     } else {
  46.         Node* new_node = new Node(position, position);
  47.         new_node->sum = new_value;
  48.         return new_node;
  49.     }
  50. }
  51.  
  52. //int get_r(Node* node, int k, bool* is_not_here) {  // k начинается с 1
  53. //    if (k > node->sum) {
  54. //        *is_not_here = true;
  55. //        return 0;
  56. //    }
  57. //    if (!node->left_son) { return node->left_bound; }
  58. //    if (node->left_son->sum >= k) {
  59. //        return get_r(node->left_son, k, is_not_here);
  60. //    } else {
  61. //        return get_r(node->right_son, k - node->left_son->sum, is_not_here);
  62. //    }
  63. //}
  64.  
  65. int main() {
  66.     int n, q;
  67.     std::cin >> n >> q;
  68.     std::vector<int> input;
  69. //    for (int i = 0; i < n; ++i) {
  70. //        int x;
  71. //        std::cin >> x;
  72. //        input.push_back(x);
  73. //    }
  74.     std::vector<Node*> versions;
  75. //    std::set<int> used;
  76. //    std::map<int, int> int_to_ind;
  77. //    std::vector<int> numbers(input.size(), 0);
  78.  
  79. //    numbers[input.size() - 1] = 1;
  80. //    int_to_ind[input[input.size() - 1]] = input.size() - 1;
  81. //    used.insert(input[input.size() - 1]);
  82.     Node* root = MakeNode(1, n);
  83.     versions.push_back(root);
  84.     for (int i = 1; i <= q; ++i) {
  85.         int m, p, x;
  86.         std::cin >> m >> p >> x;
  87.         Node* new_version = set(versions[m], p + 1, x); // +- 1
  88.         versions.emplace_back(new_version);
  89. //        new_version = set(new_version, l + 1, 1);
  90.     }
  91.     int sum = 0;
  92.     for (auto elem : versions) {
  93.         sum += elem->sum;
  94.     }
  95.     std::cout << sum;
  96. //    for (int l = input.size() - 2; l >= 0; --l) {
  97. //        if (used.contains(input[l])) {
  98. //            Node* new_version = set(versions.back(), int_to_ind[input[l]] + 1, 0);
  99. //            new_version = set(new_version, l + 1, 1);
  100. //            int_to_ind[input[l]] = l;
  101. //            versions.push_back(new_version);
  102. //        } else {
  103. //            int_to_ind[input[l]] = l;
  104. //            used.insert(input[l]);
  105. //            Node* new_version = set(versions.back(), l + 1, 1);
  106. //            versions.push_back(new_version);
  107. //        }
  108. //    }
  109.  
  110. //    int q = 0;
  111. //    std::cin >> q;
  112. //    int p = 0;
  113. //    for (int i = 0; i < q; ++i) {
  114. //        int x, y;
  115. //        std::cin >> x >> y;
  116. //        int l = ((x + p) % n) + 1;
  117. //        int k = ((y + p) % m) + 1;
  118. //
  119. //        bool is_not_there = false;
  120. //        int result = get_r(versions[versions.size() - l], k, &is_not_there);
  121. //        if (is_not_there) {
  122. //            std::cout << 0 << std::endl;
  123. //            p = 0;
  124. //        } else {
  125. //            std::cout << result << std::endl;
  126. //            p = result;
  127. //        }
  128. //    }
  129.     return 0;
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement