Pagini recente » Cod sursa (job #668253) | Cod sursa (job #11719) | Cod sursa (job #416502) | Cod sursa (job #2667871) | Cod sursa (job #2270795)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int heap[200001];
int pozVector[200001];
vector <int> v;
void swapHeap(int a,int b){
int aux;
aux=heap[a];
heap[a]=heap[b];
heap[b]=aux;
aux=pozVector[a];
pozVector[a]=pozVector[b];
pozVector[b]=aux;
aux=v[pozVector[a]];
v[pozVector[a]]=v[pozVector[b]];
v[pozVector[b]]=aux;
}
void upHeap(int poz,int m){
while(poz>=1 && heap[poz/2]>heap[poz]){
swapHeap(poz/2,poz);
poz/=2;
}
}
void downHeap(int poz,int m){
int flag=0,poz_swap;
while(flag==0){
poz_swap=0;
if(poz*2<=m && heap[2*poz]<heap[poz]) poz_swap=2*poz;;
if(poz*2+1<=m && heap[2*poz+1]<heap[poz] && heap[2*poz+1]<heap[2*poz]) poz_swap=2*poz+1;
if(poz_swap==0) flag=1;
else{
swapHeap(poz_swap,poz);
poz=poz_swap;
}
}
}
int main()
{
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n;
fin>>n;
int i,m=0,operation,val,poz;
v.push_back(0);
for(i=0;i<n;i++){
fin>>operation;
if(operation!=3) fin>>val;
if(operation==1){
m++;
v.push_back(m);
heap[m]=val;
pozVector[m]=v.size()-1;
upHeap(m,m);
}
else if(operation==2){
poz=v[val]; /*pozitie in heap a elementului*/
heap[poz]=heap[m];
m--;
downHeap(poz,m);
}
else{
fout<<heap[1]<<endl;
}
}
return 0;
}