Cod sursa(job #2893770)

Utilizator VartonVarts Var Varton Data 26 aprilie 2022 17:26:20
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 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, aux[nrmax], heap[nrmax], n;

void heapify( 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(parinte);
        }
    }
}

void heapifyTop(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(mx);
    }

}

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

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

    n--;
    heapifyTop(0);
}


int main()
{


    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(val);
        }
        if(op==2)
        {
            is>>val;
            stergere(val);
        }
        if(op==3)
            os<<heap[0]<<endl;
    }
    return 0;
}