Pagini recente » Cod sursa (job #1667745) | Cod sursa (job #1859484) | Cod sursa (job #762469) | Cod sursa (job #416531) | Cod sursa (job #1848855)
#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, H2[NR], Nr;
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]);
swap(H2[k],H2[son]);
V[H2[k]]=k;
k=son;
}
}
}
while(son);
}
void percolate(int k)
{
int key=H[k];
int key2=H2[k];
while((k>1)&&(key<H[k/2]))
{
H[k]=H[k/2];
H2[k]=H2[k/2];
V[H2[k]]=k;
k=k/2;
}
H[k]=key;
H2[k]=key2;
V[key2]=k;
}
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++;
Nr++;
H[N]=x;
H2[N]=Nr;
percolate(N);
}
if(v==2)
{
int nr;
fin>>nr;
int k=V[nr];
H[k]=H[N];
N--;
percolate(k);
sift(k);
}
}
return 0;
}