Pagini recente » Cod sursa (job #2095719) | Cod sursa (job #2963050) | Cod sursa (job #650484) | Cod sursa (job #2475259) | Cod sursa (job #2148463)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
/*
h[1] = radacina (minimul)
h[2*i] = fiul stang al lui i
h[2*i+1] = fiul drept al lui i
=> h[i/2] = tatal lui i
pentru a avea heap vom avea grija ca h[i] sa fie mai mic decat h[2*i] si h[2*i+1]
adaugarea lui x in heap:
h[++nh] = x;
urca(nh);
void urca(int p) {
while (p > 1 && h[p] < h[p/2]) {
swap(h[p], h[p/2]);
p /= 2;
}
}
stergerea celui de pe pozitia p in heap:
swap(h[p], h[nh--]);
urca(p);
coboara(p);
void coboara(int p) {
int fs = 2 * p, fd = 2 * p + 1, bun = p;
if (fs <= nh && h[fs] < h[bun]) {
bun = fs;
}
if (fd <= nh && h[fd] < h[bun]) {
bun = fd;
}
if (bun != p) {
swap(h[p], h[bun]);
coboara(bun);
}
}
*/
/*
v[i] = al i-lea citit
h[i] = heap-ul (in care pastram pozitii din v): la urca vom compara v[h[p]] cu v[h[p/2]]
poz[j] = i <=> h[i] = j
poz[h[i]] = i
*/
const int N=200005;
int h[N],n,a[N],k=0,poz[N],q,v[N];
void swapp(int p, int q)
{
swap(h[p], h[q]);
poz[h[p]] = p;
poz[h[q]] = q;
}
void coboara(int p)
{
int fs=2*p,fd=2*p+1,bun=p;
//out<<h[fs]<<" "<<h[fd]<<" "<<h[bun]<<endl;
if(fs<=q && v[h[fs]]< v[h[bun]])
bun=fs;
if(fd<=q && v[h[fd]]< v[h[bun]])
bun=fd;
if(bun!=p)
{
swapp(p,bun);
coboara(bun);
}
}
void sterge(int nod)
{
swap(h[nod],h[q--]);
coboara(nod);
}
void urca(int nod)
{
while (nod>1 && v[h[nod]] < v[h[nod/2]])
{
swapp(nod,nod/2);
nod=nod/2;
}
}
int main()
{
int i,j,x,y;
in>>n;
for(i=1; i<=n; i++)
{
in>>x;
//out<<x<<endl;
if(x==3)
{
out<<v[h[1]]<<'\n';
}
else
{
if(x==1)
{
in>>y;
v[++k]=y;
h[++q]=k;
poz[k] = q;
urca(q);
}
if(x==2)
{
in>>y;
sterge(poz[y]);
}
}
/*for(j=1; j<=k; j++)
out<<poz[j]<<" ";
out<<endl;
for(j=1; j<=k; j++)
out<<v[j]<<" ";
out<<endl;
for(j=1; j<=q; j++)
out<<h[j]<<" ";
out<<endl;
out<<endl;
*/
}
/*
i=0;
while(i<n)
{
in>>h[++i];
urca(i);
}
for(i=1;i<=n;i++)
out<<h[i]<<" ";
out<<endl;
while(n>0)
sterge(1);
for(i=1; i<=k; i++)
out<<a[i]<<" ";
*/
return 0;
}