Pagini recente » Cod sursa (job #1453985) | Istoria paginii runda/sim0001 | Borderou de evaluare (job #103638) | Atasamentele paginii Clasament wellcodesimulareclasa10-11martie | Cod sursa (job #1979339)
#include <fstream>
using namespace std;
ofstream fout("heapuri.out");
ifstream fin("heapuri.in");
int v[800010],a[200010],pos[200010],o,x,lg,n;
void add(int nod)
{
int parinte = nod/2;
if(v[parinte] > v[nod]){
swap(pos[a[parinte]],pos[a[nod]]);
swap(a[parinte], a[nod]);
swap(v[parinte], v[nod]);
add(parinte);
}
}
void del(int nod)
{
int copil1 = nod*2;
int copil2 = nod*2 + 1;
if(v[copil1] > v[copil2] && copil2 <= lg && v[copil2] != -1){
swap(pos[a[nod]],pos[a[copil2]]);
swap(a[nod], a[copil2]);
swap(v[copil2], v[nod]);
del(copil2);
}
else if(copil1 <= lg && v[copil1] != -1){
swap(pos[a[nod]],pos[a[copil1]]);
swap(a[nod], a[copil1]);
swap(v[copil1], v[nod]);
del(copil1);
}
else{
v[nod] = -1;
pos[a[nod]]=-1;
a[nod]=-1;
}
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++){
fin >> o;
if(o == 1){
fin >> x;
v[++lg] = x;
a[lg] = lg;
pos[lg] = lg;
add(lg);
}
else if(o == 2){
fin >> x;
del(pos[x]);
}
else if(o == 3){
fout << v[1] << '\n';
}
}
return 0;
}