Pagini recente » Cod sursa (job #2732656) | Cod sursa (job #2740029) | Cod sursa (job #1863879) | Cod sursa (job #2139418) | Cod sursa (job #749800)
Cod sursa(job #749800)
#include <iostream>
#include <fstream>
using namespace std;
int k, h[1000001], poz[1000001], nh, nr, v[1000001];
ifstream in("heapuri.in");
ofstream out("heapuri.out");
void scrie ()
{
out << "heapul: ";
for(int i=1 ; i<=nh ; i++)
out << v[h[i]] << " " ;
out << "\n";
}
void schimb (int a, int b)
{
int aux;
aux=h[a];
h[a]=h[b];
h[b]=aux;
poz[h[a]] = a;
poz[h[b]] = b;
}
void up (int p)
{
while(p>1 && v[h[p]]<v[h[p/2]])
{
schimb(p,p/2);
p=p/2;
}
}
void down (int p)
{
int fs=2*p, fd=2*p+1, pmin=p;
if(fs<=nh && v[h[fs]]<v[h[pmin]])
pmin=fs;
if(fd<=nh && v[h[fd]]<v[h[pmin]])
pmin=fd;
if(p!=pmin)
{
schimb (p, pmin);
down(pmin);
}
}
int main()
{
int N, i, op, x, m;
in>>N;
for(i=1 ; i<=N ; i++)
{
in >> op;
if(op==3)
{
out << v[h[1]] << "\n";
continue;
}
in >> x;
if(op == 1)
{
v[++nr] = x;
h[++nh] = nr;
poz[nr] = nh;
up(nh);
}
else
{
m = poz[x];
schimb(poz[x],nh--);
down(m);
}
//scrie();
}
return 0;
}