Advertisement
Guest User

Untitled

a guest
May 24th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3.  
  4.  
  5. using namespace std;
  6.  
  7.  
  8. int size_h_max = 0;
  9. int size_h_min = 0;
  10.  
  11. struct Node
  12. {
  13.         unsigned int data;
  14.         int i_max;
  15.         int i_min;
  16.         int piorytet;
  17. };
  18.  
  19.  
  20. int parent(int i)
  21. {
  22.         return i / 2;
  23. }
  24.  
  25. int left(int i)
  26. {
  27.         return i * 2;
  28. }
  29.  
  30. int right(int i)
  31. {
  32.         return i * 2 + 1;
  33. }
  34.  
  35. void heap_push_max(Node * tab[], unsigned int elem)
  36. {
  37.         int i = size_h_max + 1;
  38.         tab[i]->data = elem;
  39.         int tmp;
  40.         tab[i]->i_max = i;
  41.  
  42.         while (i>1)
  43.         {
  44.                 if (tab[parent(i)]->data > tab[i]->data)
  45.                 {
  46.                         break;
  47.                 }
  48.         /*      else if (tab[parent(i)]->data == tab[i]->data && tab[parent(i)]->piorytet < tab[i]->piorytet)
  49.                 {
  50.                         swap(tab[parent(i)], tab[i]);
  51.                         tmp = tab[parent(i)]->i_max;
  52.                         tab[parent(i)]->i_max = tab[i]->i_max;
  53.                         tab[i]->i_max = tmp;
  54.  
  55.                         i /= 2;
  56.                 }*/
  57.                 else
  58.                 {
  59.                         swap(tab[parent(i)], tab[i]);
  60.                         tmp = tab[parent(i)]->i_max;
  61.                         tab[parent(i)]->i_max = tab[i]->i_max;
  62.                         tab[i]->i_max = tmp;
  63.  
  64.                         i /= 2;
  65.                 }
  66.         }
  67.         size_h_max++;
  68. }
  69.  
  70.  
  71.  
  72. void heap_push_min(Node * tab[], unsigned int elem)
  73. {
  74.         int i = size_h_min + 1;
  75.         tab[i]->data = elem;
  76.         int tmp;
  77.         tab[i]->i_min = i;
  78.  
  79.         while (i>1)
  80.         {
  81.                 if (tab[parent(i)]->data < tab[i]->data)
  82.                 {
  83.                         break;
  84.                 }
  85.                 else
  86.                 {
  87.                         swap(tab[parent(i)], tab[i]);
  88.                         tmp = tab[parent(i)]->i_min;
  89.                         tab[parent(i)]->i_min = tab[i]->i_min;
  90.                         tab[i]->i_min = tmp;
  91.  
  92.                         i /= 2;
  93.                 }
  94.         }
  95.         size_h_min++;
  96. }
  97.  
  98. void heapify_max(Node * tab[], int i, int size)
  99. {
  100.         int tmp;
  101.  
  102.         int L = left(i);
  103.         int R = right(i);
  104.         int maxps;
  105.  
  106.         if (L <= size && tab[L]->data > tab[i]->data)
  107.         {
  108.                 maxps = L;
  109.         }
  110.         else
  111.         {
  112.                 maxps = i;
  113.         }
  114.  
  115.         if (R <= size && tab[R]->data > tab[maxps]->data)
  116.         {
  117.                 maxps = R;
  118.         }
  119.         if (maxps != i)
  120.         {
  121.                 swap(tab[i], tab[maxps]);
  122.                 tmp = tab[i]->i_max;
  123.                 tab[i]->i_max = tab[maxps]->i_max;
  124.                 tab[maxps]->i_max = tmp;
  125.                 heapify_max(tab, maxps, size);
  126.         }
  127. }
  128.  
  129. void heapify_up_max(Node * tab[], int i)
  130. {
  131.         int tmp;
  132.         while (i > 1)
  133.         {
  134.                 if (tab[parent(i)]->data < tab[i]->data)
  135.                 {
  136.                         swap(tab[i], tab[parent(i)]);
  137.                         tmp = tab[i]->i_max;
  138.                         tab[i]->i_max = tab[parent(i)]->i_max;
  139.                         tab[parent(i)]->i_max = tmp;
  140.                         i /= 2;
  141.                         heapify_up_max(tab, i);
  142.                 }
  143.                 else
  144.                 {
  145.                         break;
  146.                 }
  147.         }
  148.  
  149. }
  150.  
  151. void heapify_up_min(Node * tab[], int i)
  152. {
  153.         int tmp;
  154.         while (i > 1)
  155.         {
  156.                 if (tab[parent(i)]->data > tab[i]->data)
  157.                 {
  158.                         swap(tab[i], tab[parent(i)]);
  159.                         tmp = tab[i]->i_min;
  160.                         tab[i]->i_min = tab[parent(i)]->i_min;
  161.                         tab[parent(i)]->i_min = tmp;
  162.                         i /= 2;
  163.                         heapify_up_min(tab, i);
  164.                 }
  165.                 else
  166.                 {
  167.                         break;
  168.                 }
  169.         }
  170.  
  171. }
  172.  
  173. void heapify_min(Node * tab[], int i, int size)
  174. {
  175.         int tmp;
  176.  
  177.         int L = left(i);
  178.         int R = right(i);
  179.         int maxps;
  180.  
  181.         if (L <= size && tab[L]->data < tab[i]->data && tab[L]->data > 0)
  182.         {
  183.                 maxps = L;
  184.         }
  185.         else
  186.         {
  187.                 maxps = i;
  188.         }
  189.  
  190.         if (R <= size && tab[R]->data < tab[maxps]->data && tab[R]->data > 0)
  191.         {
  192.                 maxps = R;
  193.         }
  194.         if (maxps != i)
  195.         {
  196.                 swap(tab[i], tab[maxps]);
  197.                 tmp = tab[i]->i_min;
  198.                 tab[i]->i_min = tab[maxps]->i_min;
  199.                 tab[maxps]->i_min = tmp;
  200.                 heapify_min(tab, maxps, size);
  201.         }
  202. }
  203.  
  204.  
  205.  
  206.  
  207. void delete_elem_max(Node * tab[], int i)
  208. {
  209.         int j = size_h_max;
  210.         int tmp;
  211.  
  212.         if (i == j)
  213.         {
  214.                 size_h_max--;
  215.         }
  216.         else
  217.         {
  218.                 swap(tab[i], tab[j]);
  219.                 tmp = tab[i]->i_max;
  220.                 tab[i]->i_max = tab[j]->i_max;
  221.                 tab[j]->i_max = tmp;
  222.                 size_h_max--;
  223.  
  224.                 if (i>1 && tab[parent(i)]->data < tab[i]->data)
  225.                 {
  226.                         heapify_up_max(tab, i);
  227.                 }
  228.                 else
  229.                 {
  230.                         heapify_max(tab, i, size_h_max);
  231.                 }
  232.         }
  233.  
  234.  
  235. }
  236.  
  237.  
  238. void delete_elem_min(Node * tab[], int i)
  239. {
  240.         int j = size_h_min;
  241.         int tmp;
  242.        
  243.         if (i == j)
  244.         {
  245.                 size_h_min--;
  246.         }
  247.         else
  248.         {
  249.                 swap(tab[i], tab[j]);
  250.                 tmp = tab[i]->i_min;
  251.                 tab[i]->i_min = tab[j]->i_min;
  252.                 tab[j]->i_min = tmp;
  253.                 size_h_min--;
  254.  
  255.                 if (i > 1 && tab[parent(i)]->data > tab[i]->data)
  256.                 {
  257.                         heapify_up_min(tab, i);
  258.                 }
  259.                 else
  260.                 {
  261.                         heapify_min(tab, i, size_h_min);
  262.                 }
  263.         }
  264. }
  265.  
  266.  
  267.  
  268.  
  269.  
  270. long long int collatz(unsigned int n)
  271. {
  272.         unsigned int m;
  273.         m = n;
  274.  
  275.         if (n % 2 == 0)
  276.         {
  277.                 return n / 2;
  278.         }
  279.         else
  280.         {
  281.                 n = 3 * n + 1;
  282.                 if ((n - 1) / 3 != m)
  283.                 {
  284.                         return 0;
  285.                 }
  286.                 else
  287.                 {
  288.                         return n;
  289.                 }
  290.         }
  291.  
  292. }
  293.  
  294. void test(Node * tab_max[], Node * tab_min[], Node tab[], int n)
  295. {
  296.         for (int i = 1; i <= size_h_max; i++)
  297.         {
  298.                 cout << tab_max[i]->data << ' ';
  299.         }
  300.         cout << "max" << endl;
  301.  
  302.         for (int i = 1; i <= size_h_min; i++)
  303.         {
  304.                 cout << tab_min[i]->data << ' ';
  305.         }
  306.         cout << "min" << endl;
  307.  
  308.         for (int i = 1; i <= n; i++)
  309.         {
  310.                 if (tab[i].data == 0)
  311.                 {
  312.                         cout << 'm' << ' ';
  313.                 }
  314.                 else
  315.                 {
  316.                         cout << tab[i].data << ' ';
  317.                 }
  318.         }
  319.         cout << "str" << endl;
  320.         cout << "*******************************" << endl;
  321. }
  322.  
  323.  
  324.  
  325. int main()
  326. {
  327.  
  328.         int n, q, c;
  329.         int tmpp;
  330.         unsigned int tmp;
  331.         char temp;
  332.  
  333.         cin >> n;
  334.         Node **tab_min = new Node *[n + 1];
  335.         Node **tab_max = new Node *[n + 1];
  336.         Node *tab = new Node[n + 1];
  337.  
  338.  
  339.         for (int i = 1; i <= n; i++)
  340.         {
  341.                 cin >> tmp;
  342.                 tab_max[i] = &(tab[i]);
  343.                 heap_push_max(tab_max, tmp);
  344.                 tab_min[i] = &(tab[i]);
  345.                 heap_push_min(tab_min, tmp);
  346.                 tab[i].piorytet = 6000 - i;
  347.         }
  348.  
  349.         /*
  350.         for (int i = 1; i <= size_h_max; i++)
  351.         {
  352.         cout << tab_max[i]->data << ' ';
  353.         }
  354.         cout << "max" << endl;
  355.  
  356.         for (int i = 1; i <= size_h_max; i++)
  357.         {
  358.         cout << tab_min[i]->data << ' ';
  359.         }
  360.         cout << "min" << endl;
  361.  
  362.         for (int i = 1; i <= n; i++)
  363.         {
  364.         if (tab[i].data == 0)
  365.         {
  366.         cout << 'm' << ' ';
  367.         }
  368.         else
  369.         {
  370.         cout << tab[i].data << ' ';
  371.         }
  372.         }
  373.         cout << "str" << endl;
  374.         cout << "*******************************" << endl;
  375.         */
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.         cin >> q;
  383.  
  384.  
  385.         for (int i = 0; i < q; i++)
  386.         {
  387.                 cin >> c;
  388.                 cin >> temp;
  389.  
  390.                 if (temp == 's')
  391.                 {
  392.                         for (int i = 0; i < c; i++)
  393.                         {
  394.                                 if (size_h_min > 0)
  395.                                 {
  396.                                         while (tab_min[1]->data == 1 && size_h_min > 0)
  397.                                         {
  398.                                                 tmpp = tab_min[1]->i_max;
  399.                                                 delete_elem_min(tab_min, 1);
  400.                                                 delete_elem_max(tab_max, tmpp);
  401.                                         }
  402.                                         tab_min[1]->data = collatz(tab_min[1]->data);
  403.                                         if (tab_min[1]->data == 1 && size_h_min > 0)
  404.                                         {
  405.                                                 tmpp = tab_min[1]->i_max;
  406.                                                 delete_elem_min(tab_min, 1);
  407.                                                 delete_elem_max(tab_max, tmpp);
  408.                                         }
  409.                                         if (tab_min[1]->data == 0 && size_h_min > 0)
  410.                                         {
  411.                                                 tmpp = tab_min[1]->i_max;
  412.                                                 delete_elem_min(tab_min, 1);
  413.                                                 delete_elem_max(tab_max, tmpp);
  414.                                         }
  415.                                         else if (size_h_min > 0)
  416.                                         {
  417.                                                 heapify_up_max(tab_max, tab_min[1]->i_max);
  418.                                                 heapify_max(tab_max, tab_min[1]->i_max, size_h_max);
  419.                                                 heapify_min(tab_min, 1, size_h_min);
  420.                                         }
  421.                                 }
  422.                         }
  423.                 }
  424.                 else if (temp == 'l')
  425.                 {
  426.                         for (int i = 0; i < c; i++)
  427.                         {
  428.                                 if (size_h_max > 0 && tab_max[1]->data != 1)
  429.                                 {
  430.                                         tab_max[1]->data = collatz(tab_max[1]->data);
  431.                                         if (tab_max[1]->data == 0 && size_h_max > 0)
  432.                                         {
  433.                                                 tmpp = tab_max[1]->i_min;
  434.                                                 delete_elem_max(tab_max, 1);
  435.                                                 delete_elem_min(tab_min, tmpp);
  436.                                         }
  437.                                         if (tab_max[1]->data == 1 && size_h_max > 0)
  438.                                         {
  439.                                                 tmpp = tab_max[1]->i_min;
  440.                                                 delete_elem_max(tab_max, 1);
  441.                                                 delete_elem_min(tab_min, tmpp);
  442.                                         }
  443.                                         else if (size_h_max > 0)
  444.                                         {
  445.                                                 heapify_up_min(tab_min, tab_max[1]->i_min);
  446.                                                 heapify_min(tab_min, tab_max[1]->i_min, size_h_min);
  447.                                                 heapify_max(tab_max, 1, size_h_max);
  448.                                         }
  449.                                 }
  450.                         }
  451.                 }
  452.         }
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.         for (int i = 1; i <= n; i++)
  460.         {
  461.  
  462.  
  463.                 if (tab[i].data == 0)
  464.                 {
  465.                         cout << 'm' << ' ';
  466.                 }
  467.                 else
  468.                 {
  469.                         cout << tab[i].data << ' ';
  470.                 }
  471.  
  472.         }
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.         return 0;
  481. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement