Pagini recente » Cod sursa (job #2931847) | Rating Butnaru Petre (buntaru) | Cod sursa (job #1387013) | Cod sursa (job #1660983) | Cod sursa (job #2543291)
#include <iostream>
#include <fstream>
#define N 200202
using namespace std;
ifstream x("heapuri.in");
ofstream y("heapuri.out");
int n,nr,i,j,k,c,nod,m,h[N],ord[N],poz[N];
void percolate(int h[N], int n, int k)
{
int key=h[k],o=ord[k];
while(k>1 && key<h[k/2])
{
poz[ord[k/2]]=k;
ord[k]=ord[k/2];
h[k]=h[k/2];
k/=2;
}
h[k]=key;
ord[k]=o;
poz[o]=k;
}
void shift(int h[N], int n, int k)
{
int son,key=h[k],o=ord[k];
do
{
son=0;
if(k*2<=n)
{
son=k*2;
if(son+1<=n && h[son+1]<h[son])
son+=1;
}
if(son && key>h[son])
{
poz[ord[son]]=k;
ord[k]=ord[son];
h[k]=h[son];
k=son;
}
else
son=0;
}while(son);
h[k]=key;
ord[k]=o;
poz[o]=k;
}
void cut(int h[N], int &n, int k)
{
h[poz[k]]=h[n];
poz[ord[n]]=poz[k];
ord[poz[k]]=ord[n];
n--;
percolate(h,n,poz[k]);
shift(h,n,poz[k]);
}
void insert_h(int nod)
{
h[++n]=nod;
j++;
ord[n]=j;
poz[j]=n;
percolate(h,n,n);
}
int main()
{
x>>nr;
for(i=1;i<=nr;i++)
{
x>>c;
if(c==1)
{
x>>nod;
insert_h(nod);
}
else
{
if(c==2)
{
x>>nod;
cut(h,n,nod);
}
else
y<<h[1]<<'\n';
}
}
x.close();
y.close();
return 0;
}