Pagini recente » Cod sursa (job #475318) | Cod sursa (job #1868593) | Cod sursa (job #1810794) | Cod sursa (job #441078) | Cod sursa (job #1847109)
#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=H[2*k];
if(2*k+1>=N&&H[2*k+1]<son)
{
son=2*k+1;
}
if(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(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];
percolate(k);
sift(k);
}
}
return 0;
}