Pagini recente » Cod sursa (job #1013295) | Cod sursa (job #2957936) | Cod sursa (job #2689673) | Cod sursa (job #3122270) | Cod sursa (job #2581428)
#include <iostream>
#include<fstream>
#define N 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int h[N];//HEAP MIN
int poz[N];//poz[i]-j -->elementul intrat al i lea acum se afla pe poz j
int m;//nr operatii
int n;//lg heap
void heapup(int nod)
{
int i;
while(nod > 1 && h[nod] < h[nod/2])
{
swap(h[nod], h[nod/2]);
swap(poz[nod], poz[nod/2]);
nod = nod / 2;
}
}
void add(int val)
{
h[++n] = val;
poz[n]=n;
heapup(n);
}
inline int left(int nod)//returneaza poz fiu stanga
{
return 2*nod;
}
inline int right(int nod)
{
return 2 * nod + 1;
}
void heapdown(int nod)
{
int son;
do
{
son=0;
if(left(nod) <= nod)//daca are cel putin un fiu
{
son = left(nod);//pp ca el este mai mic
if(right(nod) && h[right(nod)] <= h[left(nod)])//daca are si fiu dreapta care este mai mic
son=right(nod);
//daca minimul dintre cei 2 fii este tot mai mare nu mai avem unde cobori
if(h[son] >= h[nod])son=0;
}
if(son)
{
swap(h[nod], h[son]);
swap(poz[nod], poz[son]);
nod = son; /// ?????????????????????????????
}
}while(son);
}
void solve3()
{
fout << h[1] << " " ;//minimul
/*h[1]=h[n--];
heapdown(1);*/
}
void sterge(int x)
{
//cel intrat al xlea se afla pe poz poz[x]
x = poz[x];
h[x] = h[n--];
//vedem daca trebuie urcat sau coborat
if(x>1 && h[x] < h[x / 2])
heapup(x);
else heapdown(x);
}
int main()
{
int i, op, x;
fin >> m;
for(i = 1; i <= m; ++i)
{
fin >> op;
if(op == 1)
{
fin >> x;
add(x);
}
if(op == 2)
{
fin >> x;
sterge(x);
}
if(op == 3)
solve3();
}
/*for(i = 1; i <= n; ++i)
fout << h[i] << " ";*/
return 0;
}