Pagini recente » Cod sursa (job #1356625) | Cod sursa (job #3173521) | Cod sursa (job #2446643) | Cod sursa (job #1567422) | Cod sursa (job #1748899)
#include <bits/stdc++.h>
#define NN 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int heap[NN],poz_v[NN],v[NN],x,n,op;
void percolate(int poz)
{
if(poz>1 && v[heap[poz]]<=v[heap[poz>>1]])
{
poz_v[heap[poz]]=poz>>1;
poz_v[heap[poz>>1]]=poz;
swap(heap[poz],heap[poz>>1]);
percolate(poz>>1);
}
}
int ind_min(int poz)
{
if(2*poz+1<=heap[0])
return ((v[heap[2*poz]]<v[heap[2*poz+1]])?(2*poz):(2*poz+1));
return 2*poz;
}
void sift(int poz)
{
if(2*poz<=heap[0])
{
int ind=ind_min(poz);
if(v[heap[poz]]>v[heap[ind]])
{
poz_v[heap[poz]]=ind;
poz_v[heap[ind]]=poz;
swap(heap[poz],heap[ind]);
sift(ind);
}
}
}
int main()
{
fin>>n;
while(n--)
{
fin>>op;
if(op<3){fin>>x;}
switch(op)
{
case 1:
{
v[++v[0]]=x;
heap[++heap[0]]=heap[0];
poz_v[++poz_v[0]]=poz_v[0];
percolate(heap[0]);
break;
}
case 2:
{
v[x]=-1;
percolate(poz_v[x]);
swap(heap[1],heap[heap[0]--]);
poz_v[heap[1]]=1;
if(heap[0]>1)
sift(1);
break;
}
case 3:
{
fout<<v[heap[1]]<<"\n";
break;
}
}
}
}