Pagini recente » Cod sursa (job #2683667) | Cod sursa (job #1046517) | Cod sursa (job #306811) | Cod sursa (job #325018) | Cod sursa (job #2268770)
#include <iostream>
#include<cstdio>
using namespace std;
const int N=200005;
int h[N];
int v[N];
int poz[N];
int nh;
void schimba(int p,int q){
swap(h[p],h[q]);
poz[h[p]]=p;
poz[h[q]]=q;
}
void urca(int p);
void adauga(int x);
void sterge(int p);
void coboara(int p);
void urca(int p){
while(p>1 && v[h[p]]<v[h[p/2]]){
schimba(p,p/2);
p/=2;
}
}
void adauga(int x){
h[++nh]=x;
poz[h[nh]]=nh;
urca(nh);
}
void coboara(int p){
int fs=2*p,fd=2*p+1,bun=p;
if(fs<=nh && v[h[fs]]<v[h[bun]])
bun=fs;
if(fd<=nh && v[h[fd]]<v[h[bun]])
bun=fd;
if(bun!=p){
schimba(bun,p);
coboara(bun);
}
}
void sterge(int p){
if(p!=nh){
schimba(p,nh);
nh--;
urca(p);
coboara(p);
}
else
nh--;
}
int main()
{
FILE*fin,*fout;
fin=fopen("heapuri.in","r");
fout=fopen("heapuri.out","w");
int a,n,i,tip,nra=0;
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&tip);
if(tip==1){
fscanf(fin,"%d",&v[++nra]);
adauga(nra);
}
if(tip==2){
fscanf(fin,"%d",&a);
sterge(poz[a]);
}
if(tip==3){
fprintf(fout,"%d\n",v[h[1]]);
}
}
return 0;
}