Cod sursa(job #2740493)

Utilizator TUdOr73Minciunescu Tudor TUdOr73 Data 13 aprilie 2021 13:00:19
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 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 min = 100000;
    if(index* 2 <= k && v[heap[index*2]] < v[heap[index]]){
        min = index* 2;
    }
    if(index * 2 + 1 <= k && v[heap[index*2+1]] < v[heap[index]]){
        if(v[heap[index*2+1]] < min)
            min = index*2 + 1;
    }
    if(min != 100000){
        swap(heap[index],heap[min]);
        swap(pozitie[heap[index]], pozitie[heap[min]]);
        coboara(min);
    }
}
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;
}