Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <iostream>
  2. #define N 100000
  3. using namespace std;
  4.  
  5. struct task
  6. {
  7.     int priorytet;
  8.     int id;
  9. };
  10. task tab[N];
  11. int n=0; //heapsize
  12. int numbertask=0;
  13. int parent(int i)
  14. {
  15.     return i/2;
  16. }
  17. int left(int i)
  18. {
  19.     return 2*i;
  20. }
  21. int right(int i)
  22. {
  23.     return 2*i+1;
  24. }
  25. void max_heapsize(int i)
  26. {
  27.     int l=left(i);
  28.     int r=right(i);
  29.     int maxx=i;
  30.     if (l<=n && tab[l].priorytet>tab[maxx].priorytet || (tab[l].priorytet==tab[maxx].priorytet && tab[l].id<tab[maxx].id))
  31.     {
  32.         maxx=l;
  33.     }
  34.     if (r<=n && tab[r].priorytet>tab[maxx].priorytet || (tab[r].priorytet==tab[maxx].priorytet && tab[r].id<tab[maxx].id))
  35.     {
  36.         maxx=r;
  37.     }
  38.     if (maxx!=i)
  39.     {
  40.         int tmm=tab[i].id;
  41.         tab[i].id=tab[maxx].id;
  42.         tab[maxx].id=tmm;
  43.         int tmp=tab[i].priorytet;
  44.         tab[i].priorytet=tab[maxx].priorytet;
  45.         tab[maxx].priorytet=tmp;
  46.         max_heapsize(maxx);
  47.     }
  48.  
  49. }
  50.  
  51. int heap_extrat_max()
  52. {
  53.     if (n==0)
  54.     {
  55.         return 0;
  56.     }
  57.     else
  58.     {
  59.         int wynik=tab[1].id;
  60.         tab[1].priorytet=tab[n].priorytet;
  61.         tab[1].id=tab[n].id;
  62.         n--;
  63.         max_heapsize(1);
  64.         return wynik;
  65.     }
  66. }
  67.  
  68. void heap_increase_key(int i, int key)
  69. {
  70.     if (key<tab[i].priorytet)
  71.     {
  72.         return;
  73.     }
  74.     else
  75.     {
  76.         tab[i].priorytet=key;
  77.         while(i>1 && (tab[i].priorytet>tab[parent(i)].priorytet) || (tab[i].priorytet==tab[parent(i)].priorytet && tab[i].id<tab[parent(i)].id))
  78.         {
  79.             int tmm=tab[i].id;
  80.             tab[i].id=tab[parent(i)].id;
  81.             tab[parent(i)].id=tmm;
  82.             int tmp=tab[i].priorytet;
  83.             tab[i].priorytet=tab[parent(i)].priorytet;
  84.             tab[parent(i)].priorytet=tmp;
  85.             i=parent(i);
  86.         }
  87.         return;
  88.     }
  89. }
  90. void max_heap_insert(int key, int idk)
  91. {
  92.     if (n==N)
  93.     {
  94.         return;
  95.  
  96.     }
  97.     else
  98.     {
  99.         n++;
  100.         tab[n].id=idk;
  101.         tab[n].priorytet=key;
  102.         heap_increase_key(n, key);
  103.     }
  104. }
  105.  
  106.  
  107. int main()
  108. {
  109.     int a, b;
  110.     cin>>b;
  111.     for(int i=0; i<b; i++)
  112.     {
  113.         cin>>a;
  114.         if (a!=0)
  115.         {
  116.             numbertask++;
  117.             max_heap_insert(a, numbertask);
  118.         }
  119.         else
  120.         {
  121.             int answer=heap_extrat_max();
  122.             if (answer!=0)
  123.             {
  124.                 cout<<answer<<" "<<n<<endl;
  125.             }
  126.  
  127.         }
  128.     }
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement