Pagini recente » Cod sursa (job #442768) | Cod sursa (job #1421336) | Cod sursa (job #2469870) | Cod sursa (job #1847838) | Cod sursa (job #2496912)
#include<fstream>
#define nmax 300000
using namespace std;
ifstream f ("heapuri.in");
ofstream g ("heapuri.out");
int heap[nmax],ordine[999999999],poz[nmax],cronologic[nmax],operati,Cerinta,x,n,n1;
void sift(int k,int n)
{
int sonleft=0,sonright=0,ales=0;
do
{
if(k*2<=n)
sonleft=k*2,ales=k*2;
if(k*2+1<=n)
{
sonright=k*2+1;
if(heap[sonleft]<heap[sonright])
ales=k*2;
else
ales=k*2+1;
}
if(heap[ales]>heap[k])
ales=0;
if(ales)
{
swap(heap[ales],heap[k]);
swap(ordine[heap[ales]],ordine[heap[k]]);
}
}while(ales);
}
void percolaite(int k,int n)
{
int tata=k/2;
while(k>1 && heap[k]<heap[tata])
{
swap(heap[k],heap[tata]);
swap(ordine[heap[k]],ordine[heap[tata]]);
k=tata;
tata=k/2;
}
}
int main()
{
f>>operati;
while(operati)
{
operati--;
f>>Cerinta;
if(Cerinta==1)
{
f>>x;
cronologic[++n1]=x;// valoarea x a fost citita in al n1 rand
n++;
ordine[x]=n;/// in ce nod se afla valoarea x
heap[n]=x; /// ce valoare se afla in nodul n
percolaite(ordine[x],n);
}
if(Cerinta==2)
{
f>>x;
heap[ordine[cronologic[x]]]=heap[n];
ordine[heap[n]]=ordine[cronologic[x]];
n--;
sift(ordine[cronologic[x]],n);
}
if(Cerinta==3)
g<<heap[1]<<endl;
}
}