Pagini recente » Cod sursa (job #2021267) | Cod sursa (job #1934881) | Cod sursa (job #2418223) | Cod sursa (job #1898813) | Cod sursa (job #1092953)
#include <fstream>
#include <algorithm>
#include <queue>
#define Nmax 200099
#define T(i) i/2
#define L(i) 2*i
#define R(i) 2*i+1
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int N,keys,H[Nmax],v[Nmax],w[Nmax],nr;
//nr va reprezenta cate chei au fost introduse
//cand o cheie dispare e nu se modifica!
//v[i]= nodul care a intrat al i-lea in ordine cronologica
//w[nod]= pe ce pozitie cronologica a intrat nodul nod
inline void Insert(int x),Delete(int x),Down(int nod),Up(int nod),Swap(int x,int y);
int main()
{
f>>N;
for(int i=1;i<=N;++i)
{
int tip;
f>>tip;
if(tip==1)
{
int x;
f>>x;
Insert(x);
}
else
if(tip==2)
{
int x;
f>>x;
Delete(x);
}
else g<<H[1]<<'\n';
}
f.close();g.close();
return 0;
}
inline void Insert(int x)
{
H[++N]=x;
v[++nr]=N;
w[N]=nr;
Up(N);
}
inline void Delete(int x)
{
int nod=v[x];
Swap(v[x],N);
--N;
Up(nod);
Down(nod);
}
inline void Down(int nod)
{
int son;
do
{
son=0;
if (L(nod)<=N)
{
son=L(nod);
if( R(nod)<=N && H[R(nod)]>H[L(nod)] ) son=R(nod);
if (H[son]>=H[nod]) son=0;
}
if (son)
{
Swap(nod,son);
nod=son;
}
} while(son);
}
inline void Up(int nod)
{
int x=H[nod];
while (nod>1 && x<H[T(nod)])
{
Swap(nod,T(nod));
nod=T(nod);
}
H[nod]=x;
}
inline void Swap(int x,int y)
{
swap(w[x],w[y]);
v[w[x]]=x;
v[w[y]]=y;
swap(H[x],H[y]);
}