Pagini recente » Cod sursa (job #2178868) | Istoria paginii runda/iiot | Istoria paginii runda/asdfghjkl | Cod sursa (job #1348811) | Cod sursa (job #633286)
Cod sursa(job #633286)
#include<stdio.h>
#define max 200100
using namespace std;
int heap[max], elem_poz[max], nr_ord[max];
int nr_operatii, nr_intr, lungime_heap;
void adauga(int elem){
int aux;
while(elem_poz[heap[elem]]<elem_poz[heap[elem/2]]){
aux=heap[elem];
heap[elem]=heap[elem/2];
heap[elem/2]=aux;
nr_ord[heap[elem]]=elem;
nr_ord[heap[elem/2]]=elem/2;
elem/=2;
}
}
void scoate(int elem){
int aux, s=0;
while(elem!=s){
s=elem;
if(s*2<=lungime_heap && elem_poz[heap[elem]]>elem_poz[heap[s*2]]) elem=s*2;
if(s*2+1<=lungime_heap && elem_poz[heap[elem]]>elem_poz[heap[s*2+1]]) elem=s*2+1;
aux=heap[elem];
heap[elem]=heap[s];
heap[s]=aux;
nr_ord[heap[elem]]=elem;
nr_ord[heap[s]]=s;
}
}
int main(){
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d", &nr_operatii);
int operatie, elem, care_elem;
for(int i=1;i<=nr_operatii;i++){
scanf("%d", &operatie);
if(operatie==1){
scanf("%d", &elem);
lungime_heap++;
nr_intr++;
elem_poz[nr_intr]=elem;
heap[lungime_heap]=nr_intr;
nr_ord[nr_intr]=lungime_heap;
adauga(lungime_heap);
}
else
if(operatie==2){
scanf("%d", &care_elem);
elem_poz[care_elem]=-1;
adauga(nr_ord[care_elem]);
heap[1]=heap[lungime_heap--];
nr_ord[heap[1]]=1;
if(lungime_heap>1) scoate(1);
}
else
if(operatie==3)
printf("%d\n", elem_poz[heap[1]]);
}
return 0;
}