Pagini recente » Cod sursa (job #69884) | Diferente pentru propuneri/2-concurs-studenti intre reviziile 11 si 12 | Istoria paginii utilizator/cristi_pralia | Monitorul de evaluare | Cod sursa (job #1532914)
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int i,n,loc[200001],x,k;
struct alalala
{
int ord, val;
}a[200001];
void adauga()
{
int k;
a[n].val = x;
a[n].ord = i;
loc[i] = n;
k = n;
while(k>0 and a[k].val<a[k/2].val)
{
swap(loc[i],loc[a[k/2].ord]);
swap(a[k],a[k/2]);
k/=2;
}
}
int minim(int a, int b)
{
if (a<b or b==0) return 2*k; else return 2*k+1;
}
void sterge()
{
int mini;
k = loc[x];
a[k].val = a[n].val;
a[k].ord = a[n].ord;
loc [a[k].ord] = k;
n--;
while(2*k<=n)
{
mini = minim(a[k*2].val,a[k*2+1].val);
swap(loc[a[k].ord],loc[a[mini].ord]);
swap(a[k],a[mini]);
k=mini;
}
}
int main()
{
int m,j,cerinta;
f>>m;
for (j=1;j<=m;j++)
{
f>>cerinta;
if (cerinta != 3) f>>x;
else g<<a[1].val<<"\n";
if (cerinta == 1) {n++; i++; adauga();}
if (cerinta == 2) {sterge();}
}
return 0;
}