Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "unistd.h"
- #include "time.h"
- #include "stdlib.h"
- void int_swap(int * x, int * y)
- {
- int tmp = *x;
- *x = *y;
- *y = tmp;
- }
- int ChL(int i)
- {
- return 2*i+1;
- }
- int ChR(int i) { return 2*i+2;}
- int Batya(int i) { return (i-1)/2;}
- void DownHeap(int * mas, int i, int n)
- {
- if (ChL(i)<n && ChR(i)<n) // Существует оба сына
- {
- if (mas[ChL(i)]>mas[ChR(i)])
- {
- if (mas[i] >= mas[ChL(i)] )
- {
- return;
- }
- else
- {
- int_swap(&mas[i],&mas[ChL(i)]);
- DownHeap(mas,ChL(i),n);
- return;
- }
- }
- else
- {
- if (mas[i] >= mas[ChR(i)] )
- {
- return;
- }
- else
- {
- int_swap(&mas[i],&mas[ChR(i)]);
- DownHeap(mas,ChR(i),n);
- return;
- }
- }
- }
- if (ChR(i)>=n && ChL(i)<n)
- {
- if (mas[i] >= mas[ChL(i)] )
- {
- return;
- }
- else
- {
- int_swap(&mas[i],&mas[ChL(i)]);
- DownHeap(mas,ChL(i),n);
- return;
- }
- }
- return;
- }
- void UpHeap (int * mas, int i, int n){
- if (mas[Batya(i)] < mas[i]){
- int_swap(&mas[i],&mas[Batya(i)]);
- UpHeap(mas, Batya(i), n);
- }
- return;
- }
- void MakeHeap(int * mas, int n)
- {
- for (int i= n/2; i>=0; i--)
- {
- DownHeap(mas,i,n);
- }
- return;
- }
- void HeapSort(int * mas, int n)
- {
- MakeHeap(mas,n);
- for(int i=0; i<n-1;i++)
- {
- int_swap(&mas[0], &mas[n-1-i]);
- DownHeap(mas,0,n-1-i);
- }
- }
- int main(){
- int n;
- scanf("%d", &n);
- int mas[100000];
- int len = 0;
- for (int i = 0; i < n; ++i){
- int c;
- scanf("%d", &c);
- if (c == 0){
- int k;
- scanf("%d", &k);
- mas[len] = k;
- ++len;
- UpHeap(mas, len - 1, len);
- }
- else{
- int_swap(&mas[0], &mas[len - 1]);
- printf("%d\n", mas[len - 1]);
- --len;
- DownHeap(mas, 0, len);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement