Pagini recente » Cod sursa (job #1558229) | Cod sursa (job #219753) | Cod sursa (job #2563961) | Cod sursa (job #2601811) | Cod sursa (job #3163257)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
#define dim 200005
vector<pair<int,int>> v;
int pos[dim];
void HeapAdd(int x,int poz)
{
int cnt=v.size();
v.push_back(make_pair(x,poz));
pos[poz]=cnt;
while(cnt!=1 && v[cnt].first<v[cnt/2].first)
{
swap(v[cnt],v[cnt/2]);
swap(pos[v[cnt].second],pos[v[cnt/2].second]);
cnt/=2;
}
}
int copilMic(int i)
{
int mini=-1,poz=-1;
if(i*2<v.size() && v[i].first>v[i*2].first)
mini=v[i*2].first,poz=i*2;
if(i*2+1<v.size() && v[i].first>v[i*2+1].first && (mini==-1 || mini>v[i*2+1].first))
poz=i*2+1;
return poz;
}
void HeapErase(int x)
{
int poz=pos[x];
int cnt;
swap(v[poz],v[v.size()-1]);
swap(pos[v[poz].second],pos[v[v.size()-1].second]);
v.pop_back();
while(poz!=1 && v[poz].first<v[poz/2].first)
{
swap(v[poz],v[poz/2]);
swap(pos[v[poz].second],pos[v[poz/2].second]);
poz/=2;
}
while(poz<v.size() && copilMic(poz)!=-1)
{
cnt=copilMic(poz);
swap(v[poz],v[cnt]);
swap(pos[v[poz].second],pos[v[cnt].second]);
poz=cnt;
}
}
int main()
{
int n,x,op,i,cntAd=0;
fin>>n;
v.resize(1);
for(i=0;i<n;i++)
{
fin>>op;
if(op==1)
{
fin>>x;
HeapAdd(x,cntAd+1);
cntAd++;
}
else if(op==2)
{
fin>>x;
HeapErase(x);
}
else
{
fout<<v[1].first<<'\n';
}
}
return 0;
}