Cod sursa(job #2893711)

Utilizator VartonVarts Var Varton Data 26 aprilie 2022 16:28:02
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream is("heapuri.in");
ofstream os("heapuri.out");
#define nrmax 200020
int poz[nrmax], ord=0, aux[nrmax];

void heapify(int heap[], int n, int i){
    int parinte = (i-1) /2;
    if(heap[parinte] > 0){
        if(heap[i]<heap[parinte]){
            //poz[ord] = parinte;
            swap(poz[ord], poz[aux[parinte]]);
            swap(heap[i], heap[parinte]);
            //ord = aux[parinte];
            swap(aux[i], aux[parinte]);
            heapify(heap, n, parinte);
        }
    }
}

void heapifyTop(int heap[], int n, int i){
    int mx = i;
    int left = 2 * mx + 1;
    int right = 2 * mx + 2;

    if(left<n && heap[left] < heap[mx])
        mx = left;
    if(right<n && heap[right]<heap[mx])
        mx = right;
    if(mx != i){
        swap(poz[aux[i]], poz[aux[mx]]);
        swap(heap[i], heap[mx]);
        swap(aux[i], aux[mx]);
        heapifyTop(heap, n, mx);
    }

}

void inserare(int heap[], int &n, int elem){
    ord++;
    n++;
    heap[n-1] = elem;
    poz[ord] = n-1;
    aux[n-1] = ord;
    heapify(heap, n, n-1);
}

void stergere(int heap[], int &n, int k){
    int s1 = poz[k];
    swap(heap[poz[k]], heap[n-1]);
    poz[aux[n-1]] = poz[k];
    aux[n-1] = s1;
    n--;
    heapifyTop(heap, n, 0);
}


int main()
{

    int heap[nrmax];
    int n = 0;
    int nr_op=0;
    is>>nr_op;
    int op, val;
    for(int i =0; i<nr_op;i++){

        is>>op;
        //cout<<endl<<op<<" "<<val;
        if(op==1)
        {
            is>>val;
            inserare(heap, n, val);
        }
        if(op==2)
        {
            is>>val;
            stergere(heap, n, val);
        }
        if(op==3)
            os<<heap[0]<<endl;
    }
    return 0;
}