Pagini recente » Cod sursa (job #1028096) | Cod sursa (job #1994318) | Cod sursa (job #1045248) | Cod sursa (job #2504038) | Cod sursa (job #2552166)
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
FILE* fin=fopen("heapuri.in", "r");
FILE* fout=fopen("heapuri.out", "w");
int v[200002], n, nr, p[200002], k;
void Urcare(int nod)
{
int auxv=v[nod], auxp=p[nod];
while (v[nod/2]>auxv && nod/2>=1)
{
v[nod]=v[nod/2];
p[nod]=p[nod/2];
nod/=2;
}
v[nod]=auxv;
p[nod]=auxp;
}
void Coborare(int nod)
{
int auxv=v[nod], auxp=p[nod];
while (min(v[nod*2], v[nod*2+1])<auxv && nod*2<=nr)
{
if (nod*2<n)
{
v[nod]=min(v[nod*2], v[nod*2+1]);
p[nod]=v[nod*2]<v[nod*2+1]?p[nod*2]:p[nod*2+1];
nod=v[nod*2]<v[nod*2+1]?nod*2:nod*2+1;
}
else
{
if (v[nod*2]<auxv)
{
v[nod]=v[nod*2];
p[nod]=p[nod*2];
nod*=2;
}
else
break;
}
}
v[nod]=auxv;
p[nod]=auxp;
}
void Delet(int nod)
{
v[nod]=v[nr];
nr--;
if (v[nod]<v[nod/2])
Urcare(nod);
else
Coborare(nod);
}
void Enter(int val)
{
nr++;
k++;
v[nr]=val;
p[nr]=k;
Urcare(nr);
}
int Gasire(int poz)
{
for (int i=1; i<=nr; i++)
{
if (p[i]==poz)
return i;
}
}
int main()
{
fscanf(fin, "%d", &n);
for (int i=1; i<=n; i++)
{
int x, a;
fscanf(fin, "%d", &x);
if (x==1)
{
fscanf(fin, "%d", &a);
Enter(a);
}
else if (x==2)
{
fscanf(fin, "%d", &a);
Delet(Gasire(a));
}
else
{
fprintf(fout, "%d\n", v[1]);
}
}
fclose(fin);
return 0;
}