Pagini recente » Cod sursa (job #316027) | Cod sursa (job #1008280) | Cod sursa (job #2831208) | Cod sursa (job #2540052) | Cod sursa (job #1213315)
#include <fstream>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int f,v[10000],pl[10000],poz,c,p,n,x,y,k;
void swi (int &a, int &b){
int aux;
aux=a;
a=b;
b=aux;
}
int a;
int main()
{
fin>>n;
for(f=1; f<=n; f++){
fin>>x; //citirea pana dupa primul if
if((x==1) || (x==2))
fin>>y;
if(x==1){ // adaugarea unui element
pl[++k]=y;
poz++;
v[poz]=y;
c=poz;
p=poz/2;
while (p>0) {
if(v[c]<v[p]){
swi(v[p],v[c]);
c=p;
p=p/2;
}else
break;
}
}
if (x==2){ // stergerea unui element... nu e un timp extraordinar, dar merge -> n*log2(n)
a=1;
while(v[a]!=pl[y])
a++;
v[a]=v[poz];
poz--;
if(v[a]<v[a/2]){ // cazul in care e mai mare ca tatal sau
p=a/2; c=a;
while(p>0){
if(v[c]>v[p]){
swi(v[p],v[c]);
c=p;
p=p/2;
}else
break;
}
}else { // cazul in care e mai mic decat fiul sau
p=a;
c=a*2;
while(c<=poz){
if( (v[c]>v[c+1])&&(c+1 <= poz) )
c++;
if(v[c]<v[p]){
swi(v[c],v[p]);
p=c;
c=c*2;
}else
break;
}
}
}
if(x==3) // afisarea celui mai mare element
fout<<v[1]<<endl;
}
return 0;
}