Pagini recente » Cod sursa (job #1778089) | Cod sursa (job #1120756) | Cod sursa (job #6935) | Cod sursa (job #1917101) | Cod sursa (job #1577144)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct elem{int val; int cron;};
elem H[200001];
int n, crt, Poz[200001], ord;
void insereaza(int x)
{
crt++;
int fiu=crt, tata=fiu/2;
while (tata)
{
if (H[tata].val>x)
{
H[fiu].val=H[tata].val;
H[fiu].cron=H[tata].cron;
Poz[H[fiu].cron]=fiu;
tata=tata/2;
fiu=fiu/2;
}
else
{
break;
}
}
H[fiu].val=x;
H[fiu].cron=ord;
Poz[H[fiu].cron]=fiu;
}
void combinare(int i)
{
int inf=H[i].val, tata=i, fiu=2*i;
while (fiu<=crt)
{
if (fiu+1<=crt && H[fiu].val>H[fiu+1].val) fiu++;
if (H[fiu].val<inf)
{
H[tata]=H[fiu];
Poz[H[fiu].cron]=Poz[H[tata].cron];
tata=fiu;
fiu=2*tata;
}
else
{
break;
}
}
H[tata].val=inf;
Poz[H[tata].cron]=tata;
}
void eliminare(int x)
{
H[x]=H[crt];
H[crt].val=0;
H[crt].cron=0;
crt--;
combinare(x);
}
int V[200001];
int main()
{
int i, c, x;
fin>>n;
for (i=1; i<=n; i++)
{
fin>>c;
if (c==1)
{
fin>>x;
V[0]++;
V[V[0]]=x;
ord++;
insereaza(x);
}
if (c==2)
{
fin>>x;
eliminare(Poz[x]);
}
if (c==3)
fout<<H[1].val<<'\n';
}
return 0;
}