Pagini recente » Cod sursa (job #2659490) | Cod sursa (job #163198) | Cod sursa (job #3172014) | Cod sursa (job #1115335) | Cod sursa (job #398584)
Cod sursa(job #398584)
using namespace std;
#include<cstdio>
#include<fstream>
#define MAX 200005
inline int father(int nod){
return nod/2;
}
inline int left_son(int nod){
return nod*2;
}
inline int right_son(int nod){
return nod*2+1;
}
int heap[MAX],//heap
v[MAX],//elementele in ordinea data
poz[MAX],//poz[i] pozitia in heap a elementului introdus al i-lea
n=0,//nr de elemente din heap la mom actual
N=0;//nr total de elemente introduse in heap,inclusiv cele sterse
void promoveaza(int k)
{
while((k>1) && (v[heap[father(k)]]>v[heap[k]]))
{
swap(heap[k],heap[father(k)]);
swap(poz[heap[father(k)]],poz[heap[k]]);
k=father(k);
}
}
void cerne(int k)
{
int son;
do
{
son=0;
if(left_son(k)<=n)
{
son=left_son(k);
if(right_son(k)<=n && v[heap[right_son(k)]]<v[heap[son]])
son=right_son(k);
if(v[heap[son]]>=v[heap[k]])
son=0;
}
if(son)
{
swap(heap[k],heap[son]);
swap(poz[heap[k]],poz[heap[son]]);
k=son;
}
}while(son);
}
void add(int valoare)
{
v[++N]=valoare;
heap[++n]=N;
poz[N]=n;
promoveaza(n);
}
void sterge(int pozitie)
{
int k=poz[pozitie];
heap[k]=heap[n];
n--;
poz[heap[k]]=k;
if((k>1) && (v[heap[father(k)]]>v[heap[k]]))
promoveaza(k);
else
cerne(k);
}
void afis()
{
int i;
for(i=1;i<=n;i++)
printf("%d ", heap[i]);
printf("\n");
for(i=1;i<=N;i++)
printf("%d ", v[i]);
printf("\n");
for(i=1;i<=N;i++)
printf("%d ", poz[i]);
printf("\n");
}
int main()
{
int i,nrop,op,a;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d", &nrop);
for(int i=1;i<=nrop;i++)
{
scanf("%d", &op);
if(op==3)
printf("%d\n", v[heap[1]]);
else
{
scanf("%d", &a);
if(op==1)
add(a);
else
sterge(a);
}
}
//afis();
return 0;
}