Pagini recente » Cod sursa (job #19433) | Cod sursa (job #2377002) | Cod sursa (job #273611) | Cod sursa (job #99088) | Cod sursa (job #2517071)
#include <bits/stdc++.h>
#define Val first
#define Poz second
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int n;
pair<int,int> heap[200001];
int vf;
int pozHeap[200001];
void insertHeap(int val,int toKeep)
{
int poz=++vf;
heap[poz].Val=val;
heap[poz].Poz=vf;
while(heap[poz].Val<heap[poz/2].Val)
{
swap(heap[poz],heap[poz/2]);
pozHeap[ heap[poz].Poz ]=poz;
poz/=2;
}
pozHeap[toKeep]=poz;
}
void combHeap(int poz,int endHeap)
{
int tata=poz,fiu=poz*2;
while(fiu<=endHeap)
{
if(fiu<endHeap && heap[fiu].Val>heap[fiu+1].Val)
fiu++;
if(heap[tata].Val>heap[fiu].Val)
{
swap(heap[tata],heap[fiu]);
pozHeap[ heap[tata].Poz ]=tata;
pozHeap[ heap[fiu].Poz ]=fiu;
tata=fiu;
fiu=tata*2;
}
else
break;
}
}
int main()
{
in>>n;
for(int q,val,i=1;i<=n;i++)
{
in>>q;
switch(q)
{
case 1:
in>>val;
insertHeap(val,i);
break;
case 2:
in>>val;
heap[ pozHeap[val] ]=heap[vf--];
combHeap(pozHeap[val],vf);
break;
case 3:
out<<heap[1].Val<<'\n';
break;
}
}
return 0;
}