Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.69 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. };
  17.  
  18.  
  19. int parent(int i)
  20. {
  21.     return i / 2;
  22. }
  23.  
  24. int left(int i)
  25. {
  26.     return i * 2;
  27. }
  28.  
  29. int right(int i)
  30. {
  31.     return i * 2 + 1;
  32. }
  33.  
  34. void heap_push_max(Node * tab[], unsigned int elem)
  35. {
  36.     int i = size_h_max + 1;
  37.     tab[i]->data = elem;   
  38.     int tmp;
  39.     tab[i]->i_max = i;
  40.  
  41.     while (i>1)
  42.     {
  43.         if (tab[parent(i)]->data > tab[i]->data)
  44.         {
  45.             break;
  46.         }
  47.         else
  48.         {
  49.             swap(tab[parent(i)], tab[i]);
  50.             tmp = tab[parent(i)]->i_max;
  51.             tab[parent(i)]->i_max = tab[i]->i_max;
  52.             tab[i]->i_max = tmp;
  53.  
  54.             i /= 2;
  55.         }
  56.     }
  57.     size_h_max++;
  58. }
  59.  
  60.  
  61.  
  62. void heap_push_min(Node * tab[], unsigned int elem)
  63. {
  64.     int i = size_h_min + 1;
  65.     tab[i]->data = elem;
  66.     int tmp;
  67.     tab[i]->i_min = i;
  68.  
  69.     while (i>1)
  70.     {
  71.         if (tab[parent(i)]->data < tab[i]->data)
  72.         {
  73.             break;
  74.         }
  75.         else
  76.         {
  77.             swap(tab[parent(i)], tab[i]);
  78.             tmp = tab[parent(i)]->i_min;
  79.             tab[parent(i)]->i_min = tab[i]->i_min;
  80.             tab[i]->i_min = tmp;
  81.  
  82.             i /= 2;
  83.         }
  84.     }
  85.     size_h_min++;
  86. }
  87.  
  88. void heapify_max(Node * tab[], int i, int size)
  89. {
  90.     int tmp;
  91.  
  92.     int L = left(i);
  93.     int R = right(i);
  94.     int maxps;
  95.  
  96.     if (L <= size && tab[L]->data > tab[i]->data)
  97.     {
  98.         maxps = L;
  99.     }
  100.     else
  101.     {
  102.         maxps = i;
  103.     }
  104.  
  105.     if (R <= size && tab[R]->data > tab[maxps]->data)
  106.     {
  107.         maxps = R;
  108.     }
  109.     if (maxps != i)
  110.     {
  111.         swap(tab[i], tab[maxps]);
  112.         tmp = tab[i]->i_max;
  113.         tab[i]->i_max = tab[maxps]->i_max;
  114.         tab[maxps]->i_max = tmp;
  115.         heapify_max(tab, maxps, size);
  116.     }
  117. }
  118.  
  119. void heapify_up_max(Node * tab[], int i)
  120. {
  121.     int tmp;
  122.     while (i > 1)
  123.     {
  124.         if (tab[parent(i)]->data < tab[i]->data)
  125.             {
  126.                 swap(tab[i], tab[parent(i)]);
  127.                 tmp = tab[i]->i_max;
  128.                 tab[i]->i_max = tab[parent(i)]->i_max;
  129.                 tab[parent(i)]->i_max = tmp;
  130.                 i /= 2;
  131.                 heapify_up_max(tab, i);
  132.             }
  133.         else
  134.         {
  135.             break;
  136.         }
  137.     }
  138.    
  139. }
  140.  
  141. void heapify_up_min(Node * tab[], int i)
  142. {
  143.     int tmp;
  144.     while (i > 1)
  145.     {
  146.         if (tab[parent(i)]->data > tab[i]->data)
  147.         {
  148.             swap(tab[i], tab[parent(i)]);
  149.             tmp = tab[i]->i_min;
  150.             tab[i]->i_min = tab[parent(i)]->i_min;
  151.             tab[parent(i)]->i_min = tmp;
  152.             i /= 2;
  153.             heapify_up_min(tab, i);
  154.         }
  155.         else
  156.         {
  157.             break;
  158.         }
  159.     }
  160.  
  161. }
  162.  
  163. void heapify_min(Node * tab[], int i, int size)
  164. {
  165.     int tmp;
  166.  
  167.     int L = left(i);
  168.     int R = right(i);
  169.     int maxps;
  170.  
  171.     if (L <= size && tab[L]->data < tab[i]->data && tab[L]->data > 0)
  172.     {
  173.         maxps = L;
  174.     }
  175.     else
  176.     {
  177.         maxps = i;
  178.     }
  179.  
  180.     if (R <= size && tab[R]->data < tab[maxps]->data && tab[R]->data > 0)
  181.     {
  182.         maxps = R;
  183.     }
  184.     if (maxps != i)
  185.     {
  186.         swap(tab[i], tab[maxps]);
  187.         tmp = tab[i]->i_min;
  188.         tab[i]->i_min = tab[maxps]->i_min;
  189.         tab[maxps]->i_min = tmp;
  190.         heapify_min(tab, maxps, size);
  191.     }
  192. }
  193.  
  194.  
  195.  
  196. void delete_root_max(Node * tab[])
  197. {
  198.     int j = size_h_max;
  199.     int tmp;
  200.  
  201.     swap(tab[1], tab[j]);
  202.     tmp = tab[1]->i_max;
  203.     tab[1]->i_max = tab[j]->i_max;
  204.     tab[j]->i_max = tmp;
  205.     size_h_max--;
  206.     heapify_max(tab, 1, size_h_max);
  207. }
  208.  
  209. void delete_root_min(Node * tab[])
  210. {
  211.     int j = size_h_min;
  212.     int tmp;
  213.  
  214.     swap(tab[1], tab[j]);
  215.     tmp = tab[1]->i_min;
  216.     tab[1]->i_min = tab[j]->i_min;
  217.     tab[j]->i_min = tmp;
  218.     size_h_min--;
  219.     heapify_min(tab, 1, size_h_min);
  220. }
  221.  
  222.  
  223.  
  224.  
  225.  
  226. long long int collatz(unsigned int n)
  227. {
  228.     unsigned int m;
  229.     m = n;
  230.  
  231.     if (n % 2 == 0)
  232.     {
  233.         return n / 2;
  234.     }
  235.     else
  236.     {
  237.         n = 3 * n + 1;
  238.         if ((n-1)/3 != m)
  239.         {
  240.             return 0;
  241.         }
  242.         else
  243.         {
  244.             return n;
  245.         }
  246.     }
  247.  
  248. }
  249.  
  250.  
  251.  
  252. int main()
  253. {
  254.  
  255.     int n, q, c;
  256.     unsigned int tmp;
  257.     char temp;
  258.  
  259.     cin >> n;
  260.     Node **tab_min = new Node *[n+1];
  261.     Node **tab_max = new Node *[n+1];
  262.     Node *tab = new Node[n+1];
  263.  
  264.  
  265.     for (int i = 1; i <= n; i++)
  266.     {
  267.         cin >> tmp;
  268.         tab_max[i] = &(tab[i]);
  269.         heap_push_max(tab_max, tmp);
  270.         tab_min[i] = &(tab[i]);
  271.         heap_push_min(tab_min, tmp);
  272.     }
  273.  
  274.     /*
  275.     for (int i = 1; i <= size_h_max; i++)
  276.     {
  277.         cout << tab_max[i]->data << ' ';
  278.     }
  279.     cout << "max" << endl;
  280.  
  281.     for (int i = 1; i <= size_h_max; i++)
  282.     {
  283.         cout << tab_min[i]->data << ' ';
  284.     }
  285.     cout << "min" << endl;
  286.  
  287.     for (int i = 1; i <= n; i++)
  288.     {
  289.         if (tab[i].data == 0)
  290.         {
  291.             cout << 'm' << ' ';
  292.         }
  293.         else
  294.         {
  295.             cout << tab[i].data << ' ';
  296.         }
  297.     }
  298.     cout << "str" << endl;
  299.     cout << "*******************************" << endl;
  300.  
  301. */
  302.  
  303.  
  304.  
  305.    
  306.     cin >> q;
  307.  
  308.  
  309.     for (int i = 0; i < q; i++)
  310.     {
  311.         cin >> c;
  312.         cin >> temp;
  313.  
  314.         if (temp == 's')
  315.         {
  316.             for (int i = 0; i < c; i++)
  317.             {
  318.                 if (size_h_min > 0)
  319.                 {
  320.                     while (tab_min[1]->data == 1 && size_h_min > 0)
  321.                     {
  322.                         delete_root_min(tab_min);
  323.                     }
  324.                     tab_min[1]->data = collatz(tab_min[1]->data);
  325.                     if (tab_min[1]->data == 0 && size_h_min > 0)
  326.                     {
  327.                         delete_root_min(tab_min);
  328.                     }
  329.                     else if (size_h_min > 0)
  330.                     {
  331.                         heapify_up_max(tab_max, tab_min[1]->i_max);
  332.                         heapify_max(tab_max, tab_min[1]->i_max, size_h_max);
  333.                         heapify_min(tab_min, 1, size_h_min);
  334.                     }
  335.                 }
  336.             }
  337.         }
  338.         else if (temp == 'l')
  339.         {
  340.             for (int i = 0; i < c; i++)
  341.             {
  342.                 if (size_h_max > 0 && tab_max[1]->data != 1)
  343.                 {
  344.                     tab_max[1]->data = collatz(tab_max[1]->data);
  345.                     if (tab_max[1]->data == 0 && size_h_max > 0)
  346.                     {
  347.                         delete_root_max(tab_max);
  348.                     }
  349.                     else if (size_h_max > 0)
  350.                     {
  351.                         heapify_up_min(tab_min, tab_max[1]->i_min);
  352.                         heapify_min(tab_min, tab_max[1]->i_min, size_h_min);
  353.                         heapify_max(tab_max, 1, size_h_max);
  354.                     }
  355.                     if (tab_min[1] == 0 && size_h_min > 0)
  356.                     {
  357.                         delete_root_min(tab_min);
  358.                     }
  359.                 }
  360.             }
  361.  
  362.  
  363.         }
  364.     }
  365.  
  366.    
  367.    
  368.  
  369.    
  370.  
  371.     for (int i = 1; i <= n; i++)
  372.     {
  373.  
  374.  
  375.         if (tab[i].data == 0)
  376.         {
  377.             cout << 'm' << ' ';
  378.         }
  379.         else
  380.         {
  381.             cout << tab[i].data << ' ';
  382.         }
  383.  
  384.     }
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.     return 0;
  393. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement