Pagini recente » Cod sursa (job #673236) | Cod sursa (job #2463601) | Cod sursa (job #1408458) | Cod sursa (job #498585) | Cod sursa (job #1847130)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int NR=200005;
int H[NR], V[NR], x, N;
void sift(int k)
{
int son;
do
{
son=0;
if(2*k<=N)
{
son=2*k;
if((2*k+1<=N)&&(H[2*k+1]<H[son]))
{
son=2*k+1;
}
if(H[son]>H[k])
son=0;
if(son)
{
swap(H[k],H[son]);
k=son;
}
}
}
while(son);
}
void percolate(int k)
{
int key=H[k];
while((k>1)&&(key<H[k/2]))
{
H[k]=H[k/2];
k=k/2;
}
H[k]=key;
}
int _find(int k)
{
if(k>N)
return 0;
if(H[k]==x)
return k;
if(H[k]>x)
return 0;
int f1=_find(2*k);
int f2=_find(2*k+1);
if(f1)
return f1;
if(f2)
return f2;
}
int main()
{
int n;
fin>>n;
for(int i=1;i<=n;i++)
{
int v;
fin>>v;
if(v==3)
{
fout<<H[1]<<'\n';
}
if(v==1)
{
fin>>x;
N++;
V[N]=x;
H[N]=x;
percolate(N);
}
if(v==2)
{
int nr;
fin>>nr;
x=V[nr];
int k=_find(1);
H[k]=H[N];
N--;
percolate(k);
sift(k);
}
}
return 0;
}