Pagini recente » Cod sursa (job #19738) | Cod sursa (job #1866397) | Cod sursa (job #328808) | Cod sursa (job #735014) | Cod sursa (job #2365130)
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn=200001;
int v[Maxn],poz[Maxn],heap[Maxn],l,k;
inline void up(int p)
{
while(p/2 && v[heap[p/2]]>v[heap[p]])
{
swap(poz[heap[p/2]],poz[heap[p]]);
swap(heap[p/2],heap[p]);
p/=2;
}
}
inline void down(int p)
{
bool ok=true;
int y;
while(2*p<=l && ok)
{
ok=false;y=2*p;
if(2*p+1<=l && v[heap[2*p]]>v[heap[2*p+1]])
y++;
if(v[heap[y]]<v[heap[p]])
{
swap(poz[heap[y]],poz[heap[p]]);
swap(heap[y],heap[p]);
p=y;ok=true;
}
}
}
inline void add(int x)
{
heap[++l]=k;poz[k]=l;
up(l);
}
inline void pop(int p)
{
heap[p]=heap[l];
poz[heap[l]]=p;
l--;
if(p/2 && v[heap[p]]<v[heap[p/2]])
up(p);
else
down(p);
}
int main()
{
FILE *fin,*fout;
fin=fopen("heapuri.in","r");
fout=fopen("heapuri.out","w");
int n,tip,x;
fscanf(fin,"%d",&n);
for(int i=0;i<n;i++)
{
fscanf(fin,"%d",&tip);
if(tip==3)
fprintf(fout,"%d\n",v[heap[1]]);
else
{
fscanf(fin,"%d",&x);
if(tip==1)
{
v[++k]=x;
add(x);
}
else
pop(poz[x]);
}
}
fclose(fin);
fclose(fout);
return 0;
}