Pagini recente » Cod sursa (job #736755) | Cod sursa (job #186533) | Cod sursa (job #2979557) | Cod sursa (job #3257577) | Cod sursa (job #2921554)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_N 200000
bool poz[MAX_N+1];
pair <int,int> heap[MAX_N+1];
int j,b;
void add(int i){
while(i && heap[(i-1)/2].first>heap[i].first){
swap(heap[i],heap[(i-1)/2]);
i=(i-1)/2;
}
}
void down(int i){
int left,right,mmin;
mmin=i;
left=i*2+1, right=i*2+2;
if(left<j && heap[left].first<heap[mmin].first)
mmin=left;
if(right<j && heap[right].first<heap[mmin].first)
mmin=right;
if(i!=mmin){
swap(heap[i],heap[mmin]);
down(mmin);
}
}
void er(){
heap[0]=heap[--j];
down(0);
}
int main(){
FILE *fin,*fout;
int n,i,k,a;
fin=fopen("heapuri.in","r");
fout=fopen("heapuri.out","w");
fscanf(fin,"%d",&n);
b=j=0;
for(i=0;i<n;i++){
fscanf(fin,"%d",&k);
if(k==1){
fscanf(fin,"%d",&a);
heap[j].first=a;
heap[j].second=b;
add(j);
j++;
b++;
}else if(k==2){
fscanf(fin,"%d",&a);
poz[a-1]=1;
}else{
while(poz[heap[0].second])
er();
fprintf(fout,"%d\n",heap[0]);
}
}
fclose(fout);
return 0;
}