Pagini recente » Cod sursa (job #3144799) | Cod sursa (job #31560) | Cod sursa (job #756606) | Cod sursa (job #3218329) | Cod sursa (job #1810001)
//Heapuri
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
#define maxDim 200000
#define maxVal 1000000000
long long N, i;
long long op, x;
long long k; //dimensiunea heap-ului
long long ins, k1;
long long Heap[maxDim]; //structura de Heap
long long Inserat[maxDim]; //retin cand a fost inserat fiecare element
long long Poz[maxDim]; //corespondenta intre Heap si Inserat
void insereaza() {
Heap[++k] = x;
Inserat[++ins] = x;
Poz[x] = k;
k1 = k;
while(Heap[k1/2] > Heap[k1] && k1 > 1) {
swap(Heap[k1/2], Heap[k1]);
swap(Poz[Heap[k1/2]], Poz[Heap[k1]]);
k1 /= 2;
}
}
void sterge() {
Heap[Poz[Inserat[x]]] = Heap[k--];
k1 = k;
while(Heap[k1/2] > Heap[k1] && k1 > 1) {
swap(Heap[k1/2], Heap[k1]);
swap(Poz[Heap[k1/2]], Poz[Heap[k1]]);
k1 /= 2;
}
while((Heap[k1] > Heap[2*k1 + 1] || Heap[k1] > Heap[2*k1]) && k1 < k) {
if(Heap[2*k1 + 1] > Heap[2*k1]) {
swap(Heap[2*k1], Heap[k1]);
swap(Poz[Heap[2*k1]], Poz[Heap[k1]]);
}
else {
swap(Heap[2*k1 + 1], Heap[k1]);
swap(Poz[Heap[2*k1 + 1]], Poz[Heap[k1]]);
}
k1 = 2*k1 + 1;
}
}
void afiseazaMinim() {
fout<<Heap[1]<<'\n';
}
int main()
{
fin>>N;
for(i = 1 ; i <= N ; i++) {
fin>>op;
if(op == 1) { fin>>x; insereaza(); }
if(op == 2) { fin>>x; sterge(); }
if(op == 3) afiseazaMinim();
}
return 0;
}