Advertisement
hurmawe

Декартовое дерево по неявному ключу 3

Mar 12th, 2021 (edited)
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. struct node // добавлено ячейка дополнительной суммы
  2. {
  3.     int value_node = NULL;
  4.     int size       = NULL;
  5.     int sum;
  6.     int add;
  7.     node* left = nullptr;
  8.     node* right = nullptr;
  9.  
  10.     node(int new_value)
  11.     {
  12.         value_node = new_value;
  13.         size = 1;
  14.     }
  15. };
  16.  
  17. void add_plant(node* A,int x, const int& left_face, const int& right_face,int left,int right) // размещение дополнительного значение
  18. {
  19.     Pair left = split(A, left_face);
  20.     Pair right = split(left.second, right_face);
  21.  
  22.     right.first->add = x;
  23.  
  24.     left.second = merge(right.first, right.second);
  25.     merge(left.first, left.second);
  26. }
  27.  
  28. void push_down(node* A) // проталкивание
  29. {
  30.     if (A->left != nullptr)
  31.     {
  32.         A->left->add = A->add;
  33.     }
  34.     if (A->right != nullptr)
  35.     {
  36.         A->right->add = A->add;
  37.     }
  38.     A->value_node += A->add;
  39.     A->add = 0;
  40. }
  41.  
  42. Pair split(node* A,const int& x) // пример расположение функции
  43. {
  44.     push_down(A);
  45.     if (!A) return { NULL ,NULL };
  46.     int l = A->left->size;
  47.     if (l >= x)
  48.     {
  49.         Pair q = split(A->left, x);
  50.         A->left = q.second;
  51.         update(A);
  52.         return { q.first, A };
  53.     }
  54.     else
  55.     {
  56.         Pair q = split(A->right, x-l-1);
  57.         A->right = q.first;
  58.         update(A);
  59.         return {A, q.second};
  60.     }
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement