Pagini recente » Cod sursa (job #2653560) | Cod sursa (job #2208030) | Cod sursa (job #2838397) | Cod sursa (job #2882001) | Cod sursa (job #1181320)
#include <fstream>
#define MX 200001
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n;
int p[MX],np;
int d[MX],t,poz[MX]; //poz[i] = pozitia nodului i in heap
void reconstituie(int i)
{
int minim,aux;
minim = i;
if(2*i <= np)
{
if(d[p[2*i]] < d[p[i]]) minim = 2*i;
}
if(2*i+1 <= np)
{
if(d[p[2*i+1]] < d[p[minim]]) minim = 2*i+1;
}
if(minim != i)
{
aux = p[i];
p[i] = p[minim];
p[minim] = aux;
poz[p[i]] = i;
poz[p[minim]] = minim;
reconstituie(minim);
}
}
int TOP()
{
return d[p[1]];
}
void PUSH(int x) //adauga un element cu valoarea x in heap
{
np++;
t++;
d[t] = x;
int mp=np;
while(mp>1 && d[p[mp/2]]>x)
{
p[mp] = p[mp/2];
poz[p[mp]] = mp;
mp /= 2;
}
p[mp] = t;
poz[p[mp]] = mp;
}
void POP(int i) //modificat sa poata scoata un termen de pe orice pozitie
{
int aux;
aux = poz[i];
poz[i] = np;
p[aux] = p[np];
poz[p[aux]] = aux;
np--;
reconstituie(aux);
}
int main()
{
int i,o,x;
fin>>n;
for(i=1; i<=n; i++)
{
fin>>o;
switch(o)
{
case 1:
{
fin>>x;
PUSH(x);
}
break;
case 2:
{
fin>>x;
POP(x);
}
break;
case 3: fout<<TOP()<<'\n'; break;
}
}
fin.close(); fout.close();
return 0;
}