Pagini recente » Cod sursa (job #1312394) | Cod sursa (job #1559839) | Cod sursa (job #373705) | Cod sursa (job #2366615) | Cod sursa (job #1795128)
#include <stdio.h>
#define MAXN 200000
int v[MAXN],heap[MAXN+1],poz[MAXN],l,k;
inline void swap(int a,int b)
{
int aux=heap[a];
heap[a]=heap[b];
heap[b]=aux;
poz[heap[a]]=a;
poz[heap[b]]=b;
}
inline void up(int p)
{
while(p/2 && v[heap[p]]<v[heap[p/2]])
{
swap(p,p/2);
p/=2;
}
}
inline void down(int p)
{
int y=p;
char ok=1;
while(ok && 2*p<=l)
{
ok=0;y=p;
if(v[heap[p]]>v[heap[2*p]])
p=2*p,ok=1;
if(2*y<l && v[heap[p]]>v[heap[2*y+1]])
p=2*y+1,ok=1;
if(ok)
swap(p,y);
}
}
inline void add(int x)
{
v[k]=x;poz[k]=++l;
heap[l]=k;k++;
up(l);
}
inline void pop(int x)
{
heap[poz[x]]=heap[l];
poz[heap[l--]]=poz[x];
if(poz[x]/2 && v[heap[poz[x]]]<v[heap[poz[x]/2]])
up(poz[x]);
else
down(poz[x]);
}
int main()
{
FILE *fin,*fout;
fin=fopen("heapuri.in","r");
fout=fopen("heapuri.out","w");
int n,i,cod,x;
fscanf(fin,"%d",&n);
for(i=0;i<n;i++)
{
fscanf(fin,"%d",&cod);
if(cod==3)
fprintf(fout,"%d\n",v[heap[1]]);
else
{
fscanf(fin,"%d",&x);
if(cod==1)
add(x);
else
pop(x-1);
}
}
fclose(fin);
fclose(fout);
return 0;
}