Pagini recente » Cod sursa (job #1269480) | Cod sursa (job #2980506) | Cod sursa (job #2173736) | Cod sursa (job #1408360) | Cod sursa (job #1577119)
#include <fstream>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int poz[200009], H[200009];
int n;
void citire ();
int inserare_nod (int val);
int combinare (int i);
int main()
{
citire();
return 0;
}
void citire ()
{
int i, j, op, ord, nr, x ;
fin>>nr;
for(i=1; i<=nr; ++i)
{
fin>>op;
if(op==1)
{
fin>>x;
poz[n+1]=inserare_nod(x);
}
else if (op==2)
{
fin>>ord;
H[poz[ord]]=H[n--];
for(j=1; j<=n; ++j)
if(poz[j]==n+1) poz[j]=combinare(poz[ord]);
}
else fout<<H[1]<<'\n';
}
}
int inserare_nod( int val )
{
int fiu, tata, i;
fiu=++n;
tata=fiu/2;
while (tata>0 && H[tata]>val)
{
H[fiu]=H[tata];
for(i=1; i<n; ++i)
if(poz[i]==tata) poz[i]=fiu;
fiu=tata;
tata=tata/2;
}
H[fiu]=val;
return fiu;
}
int combinare (int i)
{
int inf=H[i], tata=i, fiu=2*i;
while(fiu<=n)
{
if(fiu+1<=n && H[fiu]>H[fiu+1]) ++fiu;
if(H[fiu]<inf)
{
H[tata]=H[fiu];
for(i=1; i<n; ++i)
if(poz[i]==tata) poz[i]=fiu;
tata=fiu;
fiu=2*tata;
}
else break;
}
H[tata]=inf;
return tata;
}