Pagini recente » Cod sursa (job #2088154) | Cod sursa (job #553644) | Cod sursa (job #1127175) | Cod sursa (job #2826936) | Cod sursa (job #2082066)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
struct element{
int val,poz;
};
int heap[200100];
int pozitii[200100];
int marime_heap;
int min(){
return heap[1];
}
void swap(int x,int y){
int a;
//cout<<heap[x]<<"<->"<<heap[y];
a=heap[x];
heap[x]=heap[y];
heap[y]=a;
pozitii[x]=y;
pozitii[y]=x;
}
void min_heapify(int x){
int minim=x;
int st=2*x;
int dr=2*x+1;
if(st<=marime_heap&&heap[st]<heap[minim])minim=st;
if(dr<=marime_heap&&heap[dr]<heap[minim])minim=dr;
if(minim!=x){
// cout<<"AM COBORAT PE"<<x<<endl;
swap(minim,x);
min_heapify(minim);
}
}
void urcare(int x){
int minim=x;
int tata=x/2;
if(x!=1){
if(heap[tata]>heap[x]){
swap(tata,x);
if(tata!=1)
// cout<<"AM URCAT PE"<<x<<endl;
urcare(tata);}
}
}
void inserare(element a){
// cout<<"AM INSERAT PE "<<a.val<<endl;
marime_heap++;
heap[marime_heap]=a.val;
pozitii[marime_heap]=marime_heap;
urcare(marime_heap);
}
void stergere(int cron){
// cout<<"AM STERS PE "<<heap[cron]<<endl;
swap(cron,marime_heap);
pozitii[marime_heap]=0;
marime_heap--;
min_heapify(cron);
}
/*int cautare_dupa_cron(int pozi){
int i;
cout<<"AM GASIT POZITIA ";
for( i=1;i<heap.size();i++)if(heap[i].poz==pozi)break;
cout<<i<<endl;
return i;
}*/
int main()
{element aux;
int j=1;
int poz_sters;
int nrop;
int op;
in>>nrop;
for(int i=1;i<=nrop;i++){
in>>op;
switch(op){
case 1:{
in>>aux.val;
aux.poz=j;
j++;
inserare(aux);
break;
}
case 2 :{
in>>poz_sters;
stergere(pozitii[poz_sters]);
break;
}
case 3:{
out<<min()<<'\n';
break;
}
}
/*for(int s=1;s<=marime_heap;s++)cout<<heap[s]<<" ";
cout<<'\n';
for(int s=1;s<=marime_heap;s++)cout<<pozitii[s]<<" ";
cout<<'\n';*/
}
return 0;
}