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