Pagini recente » Cod sursa (job #1119522) | Cod sursa (job #880785) | Cod sursa (job #2822225) | Cod sursa (job #1887116) | Cod sursa (job #2472523)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,m=0, n_heap=0;
struct data{
int val;
int poz;
}v[200005],aux2;
int poziti[200005];
bool schimbare(int i ,int j,bool sem)
{
if(j <= 0 || j > n_heap || i<=0 || i>n_heap)
return false;
if(v[i].val<v[j].val||sem)
{
int aux = poziti[ v[j].poz ];
poziti[ v[j].poz ] = poziti[ v[i].poz ];
poziti[ v[i].poz ] = aux;
aux2 = v[i];
v[i] = v[j];
v[j] = aux2;
return true;
}
return false;
}
int minuml_dintre_copii(int i)
{
if(i*2 > n_heap)
return 0;
if(i*2+1 > n_heap || v[i*2].val < v[i*2+1].val)
return i*2;
return i*2+1;
}
void inserare(int x)
{
poziti[ ++m ] = ++n_heap ;
v[ n_heap ].val = x;
v[ n_heap ].poz = m;
int i=n_heap;
while(schimbare(i, i/2,0))
i= i/2;
}
void stergere(int x)
{
int i= v[n_heap].poz,a,b;
if(poziti[x]==n_heap)
{
n_heap--;
return;
}
schimbare( poziti[x] , n_heap ,1 );
n_heap--;
a= poziti[i];
b= minuml_dintre_copii(a);
while(schimbare( b,a,0 ) )
{
a= b;
b= minuml_dintre_copii(a);
}
}
int main()
{
int i,x,c;
fin>>n;
for(i=1;i<=n;i++)
{
fin>>c;
if(c==1)
{
fin>>x;
inserare(x);
}
if(c==2)
{
fin>>x;
stergere(x);
}
if(c==3)
{
fout<<v[1].val<<"\n";
}
}
return 0;
}