Pagini recente » Cod sursa (job #198912) | Cod sursa (job #444176) | Cod sursa (job #916144) | Cod sursa (job #1677625) | Cod sursa (job #301545)
Cod sursa(job #301545)
//heapuri
#include<fstream.h>
long v[200001],ord[200001],aux,i,n,out;
void actualizare(int m)
{int fiu=m,tata=m/2;
while(tata && v[tata]>v[fiu])
{aux=v[fiu];
v[fiu]=v[tata];
v[tata]=aux;
aux=ord[fiu];
ord[fiu]=ord[tata];
ord[tata]=aux;
fiu=tata;
tata=fiu/2;
}
}
void stergere(int m)
{int tata=0,fiu;
for(int i=1;i<=v[0]&&!tata;++i)
if(ord[i]==m) tata=i;
while(tata<v[0])
{if(v[2*tata] && v[2*tata+1])
{fiu=(v[2*tata]<v[2*tata+1]? (2*tata):(2*tata+1));
v[tata]=v[fiu];
ord[tata]=ord[fiu];
tata=fiu;
}
else if(v[2*tata])
{fiu=2*tata;
v[tata]=v[fiu];
ord[tata]=ord[fiu];
tata=fiu;
}
}
v[0]--;
}
int main()
{ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>n;
long op,t=0;
for(i=1;i<=n;++i)
{f>>op;
if(op==1)
{f>>v[++v[0]];
ord[v[0]]=++t;
actualizare(v[0]);
}
else if(op==2)
{f>>out;
stergere(out);
}
else if(op==3)
g<<v[1]<<'\n';
}
f.close();
g.close();
return 0;
}