Pagini recente » Cod sursa (job #2875293) | Cod sursa (job #1373960) | Cod sursa (job #144574) | Cod sursa (job #748057) | Cod sursa (job #2809971)
#include <fstream>
#define MAXX 200001
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int mark[MAXX];
pair <int,int> h[MAXX];
pair <int,int> swapp[2];
int n=1,m=1;
void erasee(int i){
int x;
x=2*i;
h[i]=h[m-1];
m--;
if(x<m){
swapp[0]=h[x];
if(h[x-1]<swapp[0])
swapp[0]=h[x-1];
while(x<m && h[i]>swapp[0]){
if(h[x]<h[x+1]){
swapp[1]=h[i];
h[i]=h[x];
h[x]=swapp[1];
i*=2;
}
else{
swapp[1]=h[i];
h[i]=h[x+1];
h[x+1]=swapp[1];
i*=2;
i++;
}
x=2*i;
}
}
}
void add(int nr){
int i;
h[m].first=nr;
h[m].second=n;
n++;
i=m;
m++;
while(i/2>0 && h[i]<h[i/2]){
swapp[1]=h[i];
h[i]=h[i/2];
h[i/2]=swapp[1];
i/=2;
}
}
int main(){
int intrebari,intrebare,a,i;
fin>>intrebari;
for(i=0;i<intrebari;i++){
fin>>intrebare;
if(intrebare==1 || intrebare==2){
fin>>a;
if(intrebare==1)
add(a);
else
mark[a]=1;
}
else{
while(mark[h[1].second]!=0)
erasee(1);
fout<<h[1].first<<'\n';
}
}
return 0;
}