Pagini recente » Cod sursa (job #2029252) | Cod sursa (job #1531271) | Profil Niculescu_Anca | Cod sursa (job #2005419) | Cod sursa (job #2553840)
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out ("heapuri.out");
/*
h[2i]=fiul stang al lui i;
h[2i+1]=fiul drept al lui i;
h[i/2]=tatal lui i;
inaltimea va fi [log2(n)];
HEAP: h[i] e mai bun (sau egal) ca fiii sai (h[2i], h[2i+1]);
h[i]=j : pe pozitia i in heap se afla al j-lea citit;
poz[j]=i : pozitia din heap a celui de-al j-lea citit este i;
=> h[poz[j]]=j; poz[h[i]]=i;
*/
const int N=200001;
int nh, h[N], poz[N], v[N];
void schimb(int p, int q)
{
swap(h[p], h[q]);
poz[h[p]]=p;
poz[h[q]]=q;
}
void urca(int p)
{
while(p>1 and v[h[p]]<v[h[p/2]])
{
schimb(p,p/2);
p/=2;
}
}
void coboara(int p)
{
int fs=2*p, fd=2*p+1, bun=p;
if(fs<=nh and v[h[fs]]<v[h[bun]])
bun=fs;
if(fd<=nh and v[h[fd]]<v[h[bun]])
bun=fd;
if(bun!=p)
{
schimb(p,bun);
coboara(bun);
}
}
void adauga(int x)
{
h[++nh]=x;
poz[x]=nh;
urca(nh);
}
void sterge(int p)
{
schimb(p, nh--);
urca(p);
coboara(p);
}
int main()
{
int n, op, ct=0;
in>>n;
for(int i=1; i<=n; i++)
{
int x;
in>>op;
if(op==1)
{
ct++;
in>>v[ct];
adauga(ct);
}
else if(op==2)
{
in>>x;
sterge(poz[x]);
}
else
out<<v[h[1]]<<"\n";
}
return 0;
}