Cod sursa(job #2740498)

Utilizator TUdOr73Minciunescu Tudor TUdOr73 Data 13 aprilie 2021 13:10:00
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
using namespace std;
#define maxN 200004

ifstream f("heapuri.in");
ofstream g("heapuri.out");


int heap[maxN], v[maxN], pozitie[maxN];
int nr = 0;
int k = 0;

void urca(int index){
    if (index > 0){
        int tata = index/2;
        if( v[heap[tata]] > v[heap[index]]){
            swap(heap[tata], heap[index]);
            swap(pozitie[heap[tata]], pozitie[heap[index]]);
            urca(tata);
        }
    }
}
void coboara(int index){
    int fiu = index;
    int stanga = index*2;
    int dreapta = index* 2 + 1;
    if(stanga <= k && v[heap[stanga]] < v[heap[fiu]])
        fiu = stanga;
    if(dreapta <= k && v[heap[dreapta]] < v[heap[fiu]])
        fiu = dreapta;

    if(fiu != index){
        swap(heap[index],heap[fiu]);
        swap(pozitie[heap[index]], pozitie[heap[fiu]]);
        coboara(fiu);
    }
}
void push(int x){
    k++;
    heap[k] = x;
    pozitie[heap[k]] = k;
    urca(k);
}

void pop(int x){
    int index = pozitie[x];
    swap(heap[index],heap[k]);
    swap(pozitie[heap[index]],pozitie[heap[k]]);
    k--;
    urca(index);
    coboara(index);
}
int main()
{
    int n;

    f >> n;
    for(int i = 0; i< n ; i++){
        int cod;
        f >> cod;
        if (cod == 1){
            int x;
            f>> x;
            nr++; v[nr] = x;
            push(nr);
        }
        if (cod == 2){
            int j;
            f >> j;
            pop(j);
        }
        if( cod == 3){
            g << v[heap[1]]<<endl;
        }
    }
    f.close();
    g.close();
    return 0;
}