Pagini recente » Cod sursa (job #695528) | Cod sursa (job #2117635) | Cod sursa (job #1434287) | Cod sursa (job #1704522) | Cod sursa (job #2892187)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int heap[200001], poz[200001], elpoz[1000001];
//elpoz = ordinea adaugarii elementelor
//poz = pozitia elementelor in heap
void schimbare(int p1, int p2)
{
//interschimbare elemente
int aux = heap[p1];
heap[p1] = heap[p2];
heap[p2] = aux;
//actualizare pozitii
poz[heap[p1]] = p1;
poz[heap[p2]] = p2;
}
void inserare(int pozitie, int nr)
{
heap[pozitie] = nr;
poz[nr] = pozitie;
// mut element in heap astfel: e mai mic decat tatal, fac schimb intre ele
while(pozitie/2 >= 0 && heap[pozitie] < heap[pozitie/2])
{
schimbare(pozitie, pozitie/2);
pozitie = pozitie/2;
}
}
void stergere(int nelem, int pozitie)
{
schimbare(pozitie, nelem-1);
nelem--;
while(pozitie * 2 <= nelem-1)
{
int c1=pozitie *2;
if(pozitie * 2 + 1 <= nelem-1)
{
int c2 = pozitie * 2 +1;
if(heap[pozitie] < heap[c1] && heap[pozitie] < heap[c2])
break;
if(heap[c1] <= heap[c2])
{
schimbare(pozitie, c1);
pozitie = c1;
}
else
{
schimbare(pozitie, c2);
pozitie = c2;
}
}
else
{
if(heap[pozitie] <= heap[c1])
break;
schimbare(pozitie, c1);
pozitie = c1;
}
}
}
int main()
{
int n, op, crt, nelem = 0, m = 0;
in>>n;
for(int i=0; i<n; i++)
{
in>>op;
switch(op)
{
case 1:
in>>crt;
elpoz[nelem] = crt;
inserare(nelem, crt);
nelem++;
break;
case 2:
in>>crt;
stergere(nelem, poz[elpoz[crt-1]]);
nelem--;
break;
default:
out<<heap[0]<<endl;
break;
}
}
return 0;
}