Pagini recente » Cod sursa (job #2938316) | Cod sursa (job #2743124) | Monitorul de evaluare | Cod sursa (job #2853524) | Cod sursa (job #2483574)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[200001], poz[200001], pozh[200001], k;
void Up(int nr)
{
int fiu=k;
int tata=fiu/2;
while(tata && nr < v[tata])
{
pozh[v[tata]]=fiu;
v[fiu]=v[tata];
fiu=tata;
tata=fiu/2;
}
v[fiu]=nr;
pozh[v[fiu]]=fiu;
}
void Down(int n)
{
int i=n;
while(2*i <= k && v[i]>min(v[2*i], v[2*i+1]))
{
if(2*i+1 > k)
{
if(v[i] > v[2*i])
swap(v[i], v[2*i]);
i*=2;
}
else
{
if(v[2*i] < v[2*i+1])
{
if(v[2*i] < v[i])
swap(v[2*i], v[i]);
i*=2;
}
else
{
if(v[2*i+1] < v[i])
swap(v[2*i+1], v[i]);
i*=2;
i++;
}
}
}
}
int main()
{
int x, nr, n;
fin>>n;
for(int i=1; i<=n; i++)
{
fin>>x;
if(x==1)
{
fin>>nr;
k++;
poz[k]=nr;
pozh[nr]=k;
Up(nr);
}
else
if(x==2)
{
fin>>nr;
v[pozh[poz[nr]]]=v[k--];
Down(pozh[poz[nr]]);
}
else
{
fout<<v[1]<<"\n";
}
}
return 0;
}