Pagini recente » Cod sursa (job #24201) | Cod sursa (job #3286242) | Cod sursa (job #2749310) | Cod sursa (job #2982140) | Cod sursa (job #2405710)
#include <fstream>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
int n,op,x,p[400050];
pair <int, int> v[400050];
void el(int ind);
void add(int a,int ind);
int main()
{
cin>>n;
int cnt=1;
for(int i=1; i<=n; i++)
{
cin>>op;
if(op<3)
{
cin>>x;
if(op==1)
add(x,cnt++);
else el(x);
}
else cout<<v[1].first<<'\n';
}
return 0;
}
void add(int a,int ind)
{
v[++v[0].first]={a,ind};
p[ind]=v[0].first;
int poz=v[0].first;
while(poz/2>0 && v[poz].first <v[poz/2].first)
{
swap(p[v[poz].second], p[v[poz/2].second]);
swap(v[poz],v[poz/2]);
poz=poz/2;
}
}
void el(int ind)
{
int poz=p[ind],pf=0;
swap(v[poz],v[v[0].first]);
swap(p[v[poz].second],p[v[v[0].first].second]);
v[0].first--;
if(poz/2 && v[poz/2].first>v[poz].first)
{
while(poz/2>0)
{
pf=poz/2;
if(v[pf].first>v[poz].first)
{
swap(v[poz],v[pf]);
swap(p[v[poz].second],p[v[pf].second]);
}
else break;
poz=poz/2;
}
}
else if(poz*2<=v[0].first )
while(poz*2<=v[0].first)
{
pf=poz*2;
if(poz*2+1<=v[0].first)
{
if(v[poz*2+1].first<v[poz*2].first)
pf++;
}
if(v[pf].first<v[poz].first)
{
swap(v[poz],v[pf]);
swap(p[v[poz].second],p[v[pf].second]);
}
else break;
poz=pf;
}
}