Pagini recente » Cod sursa (job #1265386) | Cod sursa (job #482104) | Cod sursa (job #2069294) | Cod sursa (job #727831) | Cod sursa (job #1695870)
#include<iostream>
#include<fstream>
#include<set>
#define DX 200010
using namespace std;
fstream fin("heapuri.in",ios::in),fout("heapuri.out",ios::out);
int h[DX],n,cine[DX],cn,pecine,poz;
void up(int nod)
{
int tata=nod/2;
while(nod>1 && h[nod]<h[tata])
{
swap(h[nod],h[tata]);
nod=tata;
tata=nod/2;
}
}
void down(int nod)
{
int fiu,plod;
do
{
plod=0;
fiu=2*nod;
if(fiu<=n)
{
plod=fiu;
if(fiu<n && h[fiu+1]<h[fiu]) plod=fiu+1;
if(h[plod]>h[nod]) plod=0;
}
if(plod!=0)
{
swap(h[plod],h[nod]);
nod=plod;
}
}while(plod!=0);
}
void find(int nod)
{
int fiu=2*nod;
if(h[nod]==pecine) poz=nod;
if(poz!=0) return ;
if(fiu<=n && h[fiu]<=pecine) find(fiu);
if(fiu<n && h[fiu+1]<=pecine) find(fiu+1);
//if(fiu<=n ) find(fiu);
//if(fiu<n ) find(fiu+1);
}
int main()
{
int m,i,j,a,b,t;
fin>>m;
for(i=1;i<=m;i++)
{
fin>>t;
if(t==1)
{
fin>>a;
cine[++cn]=a;
h[++n]=a;
up(n);
}
if(t==2)
{
fin>>a;
poz=0;
pecine=cine[a];
find(1);
h[poz]=h[n];
if(h[poz]>=h[n])
{
n--;
up(poz);
}
else
{
n--;
down(poz);
}
}
if(t==3)
{
fout<<h[1]<<"\n";
}
}
}