рдХрд╛рд░реНрдЯрд┐рд╕рд┐рдпрди рдкреЗрдбрд╝ рдирд┐рд╣рд┐рдд рдХреБрдВрдЬреА + рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕рдВрдкреАрдбрд╝рди рджреНрд╡рд╛рд░рд╛

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдЯрд┐рд╕рд┐рдпрди рдЯреНрд░реА рдирд┐рд╣рд┐рдд рдХреБрдВрдЬреА рд╕реЗ рдХреНрдпрд╛ рд╣реИ (рдпрд╣ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ )ред рд╕реНрдкреЗрд╕ рдХрдореНрдкреНрд░реЗрд╢рди рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╕реЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯ {1, 1, 1, 2, 2, 2, 3, 1, 1} рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо {1 x 3, 2 x 3, 3 x 1, 1 x 2} рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗред
рдЕрдм рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдХрд┐рд╕реА рднреА рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдСрдирд▓рд╛рдЗрди рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред

рдореИрдВ рдРрд╕реЗ рдкреЗрдбрд╝реЛрдВ рдХреЛ рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рджреЗрддрд╛ рд╣реВрдБ
struct treap_node { int x, y; treap_node *l, *r, *p; int width; int val; //    void push() { //       } //  ,     void update() { x = width; if (l) x += l -> x; if (r) x += r -> x; if (l) l -> p = this; if (r) r -> p = this; //   ,    ,      } treap_node(int _width, int _val) { //   // val -  , width -    y = (rand() << 16) + rand(); l = r = p = NULL; width = _width; val = _val; update(); } }; //  2  treap_node* merge(treap_node *l, treap_node *r) { if (l == NULL) return r; if (r == NULL) return l; if (l -> y >= r -> y) { l -> push(); l -> r = merge(l -> r, r); l -> update(); return l; } else { r -> push(); r -> l = merge(l, r -> l); r -> update(); return r; } } //  1   2 void split(treap_node *t, int x, treap_node *&l, treap_node *&r) { if (t == NULL) { l = r = NULL; return; } t -> push(); if ((t -> l == NULL ? 0 : t -> l -> x) >= x) { split(t -> l, x, l, t -> l); if (l != NULL) l -> p = NULL; t -> update(); r = t; return; } else if ((t -> l == NULL ? 0 : t -> l -> x) + t -> width <= x) { split(t -> r, x - (t -> l == NULL ? 0 : t -> l -> x) - t -> width, t -> r, r); if (r != NULL) r -> p = NULL; t -> update(); l = t; return; } else { //   .       ,      treap_node *t1 = new treap_node(x - (t -> l == NULL ? 0 : t -> l -> x), t -> val); treap_node *t2 = new treap_node(t -> width - t1 -> width, t -> val); l = merge(t -> l, t1); r = merge(t2, t -> r); l -> p = NULL; r -> p = NULL; delete(t); } } 


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдкреЗрдбрд╝реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдХреА рд╕рдВрдкрддреНрддрд┐ рджрд┐рдЦрд╛рдИ рджреА - рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдЦрдВрдб рдХреА рдЪреМрдбрд╝рд╛рдИред рдФрд░ рд╡реИрд▓ рдХрд╛ рдорддрд▓рдм рд╣реА рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ - рд╕реНрдкреНрд▓рд┐рдЯ рдлрдВрдХреНрд╢рди
 else { //   .       ,      treap_node *t1 = new treap_node(x - (t -> l == NULL ? 0 : t -> l -> x), t -> val); treap_node *t2 = new treap_node(t -> width - t1 -> width, t -> val); l = merge(t -> l, t1); r = merge(t2, t -> r); l -> p = NULL; r -> p = NULL; delete(t); } 

рдпрд╣рд╛рдБ рдЕрдЧрд░ рдХрд╛ рдПрдХ рдФрд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЬреЛ рдЦрдВрдб рдХреЗ 2 рдЙрдк-рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ gluingред

рд╣рдо рдорд░реНрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдореИрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕рдВрдкреАрдбрд╝рди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдСрдирд▓рд╛рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рджреЛ рдЦрдВрдбреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдорд░реНрдЬрд┐рде рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдирд┐рд╢реНрдЪрд┐рдд рдЦрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛, рдФрд░ рдлрд┐рд░ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреАрдиреЛ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрдВрдбреЛрдВ рдХреЗ рд╡реГрдХреНрд╖ рдореЗрдВ, рдореИрдВ, рд╕рдорд╛рди рд╡рд┐рд╖рдордХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВред рд╕рдЪ рд╣реИ, рдЖрдкрдХреЛ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рд▓рд┐рдЦрдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддреЗрдЬрд╝ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред


Source: https://habr.com/ru/post/In161093/


All Articles