Pagini recente » Cod sursa (job #789955) | Cod sursa (job #3183059) | Cod sursa (job #2581304) | Cod sursa (job #2537135) | Cod sursa (job #632299)
Cod sursa(job #632299)
//min heap
#include <cstdio>
using namespace std;
#define MAXN 200005
#define MAXIM 10005
int heap[MAXN];
int poz[MAXN],v[MAXN];//poz[i]=locul in heap pe care se afla al i-lea element introdus
int N=0;
int pozitie=MAXIM-1;
char buff[MAXIM];//citesc bucati de cate maxim 10005 caractere
void cit(int &nr){
nr=0;
while(buff[pozitie]<'0' || buff[pozitie]>'9')//cat timp nu e cifra, treci mai departe
if (++pozitie==MAXIM){
fread (buff,1,MAXIM,stdin);
pozitie=0;
}
while('0'<=buff[pozitie] && buff[pozitie]<='9'){//cat timp e cifra
nr=nr*10+buff[pozitie]-'0';
if (++pozitie==MAXIM){
fread (buff,1,MAXIM,stdin);
pozitie=0;
}
}
}
void urca(int loc){
int x;
int aux;
while((x=loc/2) && v[heap[loc]]<v[heap[x]]){
//interschimb nodul de pe locul loc cu tatal sau
poz[heap[x]]=loc;
poz[heap[loc]]=x;
aux=heap[loc];
heap[loc]=heap[x];
heap[x]=aux;
loc=x;
}
}
void coboara(int loc){
//cobor in fiul cel mai mic dintre cei doi
int aux, x, y = 0;
while (loc != y){
y = loc;
if ((x=y*2)<=N && v[heap[loc]]>v[heap[x]]) loc = x;
x++;
if (x<=N && v[heap[loc]]>v[heap[x]]) loc = x;
aux = heap[loc];
heap[loc] = heap[y];
heap[y] = aux;
poz[heap[loc]] = loc;
poz[heap[y]] = y;
}
}
int main(){
freopen ("heapuri.in","r",stdin);
freopen ("heapuri.out","w",stdout);
int n,cod,x,crono=1;
int aux;
cit(n);
int i;
for(i=0;i<n;i++){
cit(cod);
if(cod==1){
//inserez
cit(x);
v[crono]=x;
heap[++N]=crono;
poz[crono]=N;
crono++;
urca(N);
}else
if(cod==2){
//sterg al x-lea element ca ordine cronologica....
cit(x);
v[x]=-1;//ceva negativ, pt a asigura urcarea pana la radacina...
urca(poz[x]);
//poz[heap[1]]=0;
heap[1]=heap[N--];
poz[heap[1]]=1;
if(N>1)coboara(1);
//coboara(poz[x]);
}else
if(cod==3){
//afisez minimul
printf("%d\n",v[heap[1]]);
}
}
return 0;
}