Cod sursa(job #2893884)

Utilizator VartonVarts Var Varton Data 26 aprilie 2022 19:25:13
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream is("heapuri.in");
ofstream os("heapuri.out");
#define nrmax 200005
int poz[nrmax];
int ord;
int aux[nrmax];
int heap[nrmax];
int  n;
int nr_op;
int mx;
int l;
int r;
int op;
int val;
int s1;


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

void heapifyTop(int i){
    mx = i;
    l = 2 * mx + 1;
    r = 2 * mx + 2;
    if(l<n && heap[l] < heap[mx])
        mx = l;
    if(r<n && heap[r]<heap[mx])
        mx = r;
    if(mx != i){
        swap(poz[aux[i]], poz[aux[mx]]);
        swap(heap[i], heap[mx]);
        swap(aux[i], aux[mx]);
        heapifyTop(mx);
    }

}








int main()
{
    is>>nr_op;

    for(int i =0; i<nr_op;i++){
        is>>op;
        if(op==3)
        {
            os<<heap[0];
            os<<endl;
        }

        if(op==1)
        {
            is>>val;
                ord++;
                n++;
                poz[ord] = n-1;
                aux[n-1] = ord;
                    heap[n-1] = val;

    heapify(n-1);

        }
        if(op==2)
        {

            is>>val;
                 s1 = poz[val];
    heap[poz[val]] =  heap[n-1];
    swap(poz[val], poz[aux[n-1]]);
    swap(aux[s1], aux[n-1]);
    n--;
    for(int i = 0; i<=2; i++)
        heapifyTop(i);
        }

    }
    return 0;
}