Advertisement
Guest User

Untitled

a guest
May 26th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.43 KB | None | 0 0
  1. #define SIZE 8
  2. #define good_size (0 <= m && m <= SIZE)
  3. #define inc (m == pm + 1)
  4. #define dec (m == pm - 1)
  5. #define full (m == SIZE)
  6. #define empty (m == 0)
  7. #define smaller (res <= a[0])
  8.  
  9. int a[SIZE];
  10. int ii;
  11. int m;
  12. int pm;
  13. int res;
  14.  
  15. bool is_heap = true;
  16. bool adding = false;
  17. bool extracting = false;
  18. bool has_last = false;
  19.  
  20. inline isHeap() {
  21. is_heap = true;
  22. int index = 0;
  23. do
  24. :: index >= m -> break;
  25. :: else ->
  26. if
  27. :: 2 * index + 1 < m && a[index] > a[2 * index + 1] -> is_heap = false; break;
  28. :: else -> skip;
  29. fi;
  30. if
  31. :: 2 * index + 2 < m && a[index] > a[2 * index + 2] -> is_heap = false; break;
  32. :: else -> skip;
  33. fi;
  34. index++;
  35. od;
  36. }
  37.  
  38. inline find(x) {
  39. has_last = false;
  40. int index2 = 0;
  41. do
  42. :: index2 >= m -> break;
  43. :: else ->
  44. if
  45. :: a[index2] == x -> has_last = true; break;
  46. :: else -> index2++;
  47. fi;
  48. od;
  49. }
  50.  
  51. inline SiftDown(x) {
  52. ii = x;
  53. do
  54. :: 2 * ii + 1 >= m -> break;
  55. :: else ->
  56. int j = ii;
  57. if
  58. :: a[2 * ii + 1] < a[j] -> j = 2 * ii + 1;
  59. :: else -> skip;
  60. fi;
  61. if
  62. :: 2 * ii + 2 < m && a[2 * ii + 2] < a[j] -> j = 2 * ii + 2;
  63. :: else -> skip;
  64. fi;
  65. if
  66. :: ii == j -> break;
  67. :: else -> skip;
  68. fi;
  69. int tmp2 = a[ii];
  70. a[ii] = a[j];
  71. a[j] = tmp2;
  72. ii = j;
  73. od;
  74. }
  75.  
  76. inline SiftUp(x) {
  77. ii = x;
  78. do
  79. :: ii <= 0 -> break;
  80. :: else ->
  81. if
  82. :: a[(ii - 1) / 2] > a[ii] ->
  83. int tmp2 = a[ii];
  84. a[ii] = a[(ii - 1) / 2];
  85. a[(ii - 1) / 2] = tmp2;
  86. ii = (ii - 1) / 2;
  87. :: else -> break;
  88. fi;
  89. od;
  90. }
  91.  
  92. inline add(v) {
  93. adding = true;
  94. if
  95. :: !full ->
  96. atomic {
  97. pm = m;
  98. a[m] = v;
  99. m++;
  100. SiftUp(m - 1);
  101. isHeap();
  102. find(v);
  103. }
  104. :: else -> skip;
  105. fi;
  106. adding = false;
  107. }
  108.  
  109. inline extract() {
  110. extracting = true;
  111. if
  112. :: !empty ->
  113. atomic {
  114. pm = m;
  115. res = a[0];
  116. m--;
  117. a[0] = a[m];
  118. SiftDown(0);
  119. isHeap();
  120. }
  121. extracting = false;
  122. :: else -> res = -1; skip;
  123. fi;
  124. extracting = false;
  125. }
  126.  
  127. inline rand(x) {
  128. x = 0;
  129. select(x: 0..10)
  130. }
  131.  
  132. active proctype Main() {
  133. m = 0;
  134. printf("started\n");
  135. do
  136. :: m > 0 ->
  137. printf("add %d\n", m);
  138. int v = 0;
  139. rand(v);
  140. printf("adding %d\n", v);
  141. add(v);
  142. printf("%d added\n", v);
  143. :: m == 0 ->
  144. printf("finish %d\n", m);
  145. break;
  146. :: else ->
  147. printf("extract %d\n", m);
  148. extract();
  149. printf("%d extracted\n", res);
  150. od;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement