vadimk772336

Untitled

Oct 28th, 2021 (edited)
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. struct heap_elements;
  5.  
  6. struct list_segments
  7. {
  8.     int l;
  9.     int r;
  10.     int status;
  11.     struct list_segments* next;
  12.     struct list_segments* prev;
  13.     int to_heap;
  14. };
  15.  
  16. struct heap_elements
  17. {
  18.     int l;
  19.     int r;
  20.     int pos;
  21.     list_segments* to_list;
  22. };
  23.  
  24. bool operator<(const heap_elements& a, const heap_elements& b)
  25. {
  26.  
  27.     if ((a.r - a.l < b.r - b.l))
  28.         return true;
  29.     if ((a.r - a.l == b.r - b.l) & (a.l > b.l))
  30.         return true;
  31.  
  32.     return false;
  33. }
  34.  
  35. class Heap
  36. {
  37.     std::vector<struct heap_elements> h;
  38.     int heap_size;
  39.  
  40. public:
  41.     Heap();
  42.     void siftup();
  43.     void siftdown(int);
  44.     void add(int, int, list_segments*);
  45.     void delete_vertex(int);
  46.     bool isempty();
  47.     heap_elements* get_head();
  48. };
  49.  
  50. Heap::Heap()
  51. {
  52.     std::vector<struct heap_elements> h;
  53.     heap_size = 0;
  54. }
  55.  
  56. heap_elements* Heap::get_head()
  57. {
  58.     return &h[0];
  59. }
  60.  
  61. bool Heap::isempty()
  62. {
  63.     if (heap_size == 0)
  64.         return true;
  65.     return false;
  66. }
  67.  
  68. void Heap::siftup()
  69. {
  70.     int curr, parent;
  71.     curr = heap_size - 1;
  72.     parent = (curr - 1) / 2;
  73.     while (parent >= 0 && curr > 0)
  74.     {
  75.         if (h[parent] < h[curr])
  76.         {
  77.             heap_elements buff = h[curr];
  78.             h[curr] = h[parent];
  79.             h[parent] = buff;
  80.  
  81.             h[curr].pos = curr;
  82.             h[parent].pos = parent;
  83.  
  84.             h[curr].to_list->to_heap = curr;
  85.             h[parent].to_list->to_heap = parent;
  86.         }
  87.         curr = parent;
  88.         parent = (curr - 1) / 2;
  89.     }
  90. }
  91.  
  92. void Heap::siftdown(int pos)
  93. {
  94.     int parent, max_child;
  95.  
  96.     int curr = pos;
  97.     int child_l = 2 * curr + 1;
  98.     int child_r = 2 * curr + 2;
  99.  
  100.     if (h[child_r] < h[child_l])
  101.         max_child = child_l;
  102.     else
  103.         max_child = child_r;
  104.  
  105.     while (child_l < heap_size)
  106.     {
  107.         if (child_l == heap_size - 1)
  108.             max_child = child_l;
  109.         else if (h[child_r] < h[child_l])
  110.             max_child = child_l;
  111.         else
  112.             max_child = child_r;
  113.  
  114.         if (h[curr] < h[max_child])
  115.         {
  116.             heap_elements buff = h[curr];
  117.             h[curr] = h[max_child];
  118.             h[max_child] = buff;
  119.  
  120.             h[curr].pos = curr;
  121.             h[max_child].pos = max_child;
  122.  
  123.             h[curr].to_list->to_heap = curr;
  124.             h[max_child].to_list->to_heap = max_child;
  125.         }
  126.  
  127.         curr = max_child;
  128.         child_l = 2 * curr + 1;
  129.         child_r = 2 * curr + 2;
  130.     }
  131. }
  132.  
  133. void Heap::add(int l, int r, list_segments* to_list)
  134. {
  135.  
  136.     heap_elements vertex;
  137.     vertex.l = 1;
  138.     vertex.r = r;
  139.     vertex.to_list = to_list;
  140.  
  141.     h.push_back(vertex);
  142.     h[heap_size].pos = heap_size;
  143.  
  144.     if (h[heap_size].to_list != NULL)
  145.         h[heap_size].to_list->to_heap = heap_size;
  146.  
  147.     heap_size++;
  148.     siftup();
  149. }
  150.  
  151. void Heap::delete_vertex(int pos)
  152. {
  153.     h[pos] = h[heap_size - 1];
  154.     h.pop_back();
  155.     heap_size--;
  156.     siftdown(pos);
  157. }
  158.  
  159. class LIST_SEGMENTS
  160. {
  161.     struct list_segments* Head;
  162.     int count;
  163.  
  164. public:
  165.     LIST_SEGMENTS();
  166.     list_segments* get_head();
  167.     void add(int, int, int, int, list_segments*);
  168.     void delete_segment(list_segments*);
  169.     void add_head(int, int, int, int);
  170. };
  171.  
  172. LIST_SEGMENTS::LIST_SEGMENTS()
  173. {
  174.     Head = NULL;
  175.     count = 0;
  176. }
  177. void LIST_SEGMENTS::add_head(int l, int r, int status, int to_heap)
  178. {
  179.     list_segments* buff = new list_segments;
  180.     buff->prev = 0;
  181.     buff->l = l;
  182.     buff->r = r;
  183.     buff->status = status;
  184.     buff->next = Head;
  185.  
  186.     if (Head != NULL)
  187.         Head->prev = buff;
  188.  
  189.     Head = buff;
  190.     count++;
  191. }
  192.  
  193. void LIST_SEGMENTS::add(int l, int r, int status, int to_heap, list_segments* segment)
  194. {
  195.     list_segments* after_segment = new list_segments;
  196.     after_segment->l = l;
  197.     after_segment->r = r;
  198.     after_segment->status = status;
  199.     after_segment->next = segment->next;
  200.     after_segment->prev = segment;
  201.     after_segment->to_heap = to_heap;
  202.  
  203.     if (segment->next != NULL)
  204.         segment->next->prev = after_segment;
  205.  
  206.     segment->next = after_segment;
  207.     count++;
  208. }
  209.  
  210. void LIST_SEGMENTS::delete_segment(list_segments* segment)
  211. {
  212.     if (segment->next != NULL)
  213.         segment->next->prev = segment->prev;
  214.     if (segment->prev != NULL)
  215.         segment->prev->next = segment->next;
  216.     else
  217.         Head = segment->next;
  218.     delete segment;
  219. }
  220.  
  221. list_segments* LIST_SEGMENTS::get_head()
  222. {
  223.     return Head;
  224. }
  225.  
  226. int main()
  227. {
  228.  
  229.     int N, M, K, q;
  230.     int old_l;
  231.  
  232.     Heap heap;
  233.     LIST_SEGMENTS List;
  234.  
  235.     heap_elements* heap_head;
  236.     std::vector<int> answers;
  237.  
  238.     std::cin >> N;
  239.  
  240.     List.add_head(1, N, 1, 0);
  241.     heap.add(1, N, List.get_head());
  242.  
  243.     std::cin >> M;
  244.     list_segments* requests[M];
  245.  
  246.     for (int i = 0; i < M; ++i)
  247.     {
  248.         std::cin >> K;
  249.  
  250.         if (K > 0)
  251.         {
  252.  
  253.             heap_head = heap.get_head();
  254.             if (!heap.isempty() & (heap_head->r - heap_head->l + 1) >= K)
  255.             {
  256.                 if ((heap_head->r - heap_head->l + 1) == K)
  257.                 {
  258.                     heap_head->to_list->status = 0;
  259.                     requests[i] = heap_head->to_list;
  260.                     answers.push_back(heap_head->l);
  261.                     heap.delete_vertex(0);
  262.                 }
  263.                 else
  264.                 {
  265.                     old_l = heap_head->l;
  266.                     heap_head->l = old_l + K;
  267.                     heap_head->to_list->l = old_l + K;
  268.  
  269.                     if (heap_head->to_list->prev != NULL)
  270.                     {
  271.                         List.add(old_l, old_l + K - 1, 0, -1, heap_head->to_list->prev);
  272.                         requests[i] = heap_head->to_list->prev;
  273.                     }
  274.                     else
  275.                     {
  276.                         List.add_head(old_l, old_l + K - 1, 0, -1);
  277.                         requests[i] = List.get_head();
  278.                     }
  279.  
  280.                     heap.siftdown(0);
  281.                     answers.push_back(old_l);
  282.                 }
  283.             }
  284.             else
  285.             {
  286.                 requests[i] = NULL;
  287.                 answers.push_back(-1);
  288.             }
  289.         }
  290.         else
  291.         {
  292.             q = abs(K) - 1;
  293.             if (requests[q] != NULL)
  294.             {
  295.                 requests[q]->status = 1;
  296.                 if (requests[q]->prev != NULL)
  297.                 {
  298.                     if (requests[q]->prev->status == 1 & requests[q]->prev->r == requests[q]->l - 1)
  299.                     {
  300.                         requests[q]->l = requests[q]->prev->l;
  301.                         heap.delete_vertex(requests[q]->prev->to_heap);
  302.                         List.delete_segment(requests[q]->prev);
  303.                     }
  304.                 }
  305.                 if (requests[q]->next != NULL)
  306.                 {
  307.                     if (requests[q]->next->status == 1 & requests[q]->next->l - 1 == requests[q]->r)
  308.                     {
  309.                         requests[q]->r = requests[q]->next->r;
  310.                         heap.delete_vertex(requests[q]->next->to_heap);
  311.                         List.delete_segment(requests[q]->next);
  312.                     }
  313.                 }
  314.  
  315.                 heap.add(requests[q]->l, requests[q]->r, requests[q]);
  316.                 requests[i] = requests[q];
  317.                 requests[q] = NULL;
  318.             }
  319.             else
  320.             {
  321.                 requests[i] = NULL;
  322.             }
  323.         }
  324.     }
  325.  
  326.     for (int i = 0; i < answers.size(); ++i)
  327.         std::cout << answers[i] << std::endl;
  328.  
  329.     return 0;
  330. }
  331.  
Add Comment
Please, Sign In to add comment