Pagini recente » Cod sursa (job #2029705) | Cod sursa (job #744585) | Cod sursa (job #1237469) | Cod sursa (job #2903087) | Cod sursa (job #1052989)
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
#define M 200010
int ord[M], poz[M], v[M], k=1;
void urca (int pozi)
{
while(pozi>1 && v[ord[pozi]]<v[ord[pozi/2]])
{
swap(ord[pozi], ord[pozi/2]);
poz[ord[pozi]]=pozi;
poz[ord[pozi/2]]=pozi/2;
pozi=pozi/2;
}
}
void coboara(int &n, int pozi)
{
if(2*pozi>n) return;
int poz1=2*pozi;
if(poz1+1<=n && v[ord[poz1]]>v[ord[poz1+1]])
poz1++;
if(v[ord[poz1]]<v[ord[pozi]])
{
swap(ord[poz1], ord[pozi]);
poz[ord[poz1]]=poz1;
poz[ord[pozi]]=pozi;
coboara(n, poz1);
}
}
void inserare(int &n, int val)
{
n++;
ord[n]=k;
poz[k]=n;
urca(n);
k++;
}
void elimina(int &n, int pozi)
{
poz[ord[pozi]]=0;
ord[pozi]=ord[n];
poz[ord[n]]=pozi;
n--;
urca(pozi);
coboara(n, pozi);
}
int main()
{
int nr, x, n=0, i, tip;
f>>nr;
for(i=1;i<=nr;i++)
{
f>>tip;
if(tip==1)
{
f>>x;
v[k]=x;
inserare(n,k);
}
if(tip==2)
{
f>>x;
elimina(n, poz[x]);
}
if(tip==3)
g<<v[ord[1]]<<'\n';
}
}