Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct node // функции по добавлению новых значений можно объединить
- {
- uint8_t color = NULL;
- int value_node = NULL;
- int size = NULL;
- int sum = NULL;
- int add = NULL;
- int add_color = NULL;
- node* left = nullptr;
- node* right = nullptr;
- node(int new_value)
- {
- value_node = new_value;
- size = 1;
- }
- node(uint8_t new_color)
- {
- color = new_color;
- }
- };
- void add_color(node* A, int color, int left_face, int right_face) // // размещение цвета
- {
- Pair left = split(A, left_face);
- Pair right = split(left.second, right_face);
- right.first->add_color = color;
- left.second = merge(right.first, right.second);
- merge(left.first, left.second);
- }
- void color_push_down(node* A) // проталкивание с замещением
- {
- if (A->left != nullptr)
- {
- A->left->color = A->add_color;
- }
- if (A->right != nullptr)
- {
- A->right->color = A->add_color;
- }
- A->color = A->add_color;
- A->add_color = 0;
- }
- void mix_color_push_down(node* A) // проталкивание с смешиванием
- {
- if (A->left != nullptr)
- {
- A->left->color = (A->add_color + A->left->color) / 2;
- }
- if (A->right != nullptr)
- {
- A->right->color = (A->add_color + A->right->color) / 2;
- }
- A->color = (A->add_color + A->color) / 2;
- A->add_color = 0;
- }
- node* merge(node* A,node* B) // пример размещение функции ( push_down() и color_push_down() также можно объединить)
- {
- push_down(A);
- push_down(B);
- color_push_down(A);
- color_push_down(B);
- if (!A) return B;
- if (!B) return A;
- if (A->size > B->size)
- {
- A->right = merge(A->right, B);
- return A;
- }
- else
- {
- B->left = merge(A, B->left);
- return B;
- }
- }
Add Comment
Please, Sign In to add comment