Pagini recente » Cod sursa (job #926187) | Cod sursa (job #1378607) | Cod sursa (job #2705444) | Cod sursa (job #1027191) | Cod sursa (job #1002695)
#include <fstream>
#include <algorithm>
#include <bitset>
#define Nmax 200099
#define Father(i) i/2
#define LeftSon(i) 2*i
#define RightSon(i) 2*i+1
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int N,n,H[Nmax],v[Nmax],w[Nmax],nr;
bitset <Nmax>Eliminat(0);
void Sift(int H[], int n,int nod)
{
int Son=0;
do
{
Son=0;
// Alege un fiu mai mare ca tatal.
if (LeftSon(nod)<=n)
{
Son=LeftSon(nod);
if( RightSon(nod)<=n && H[RightSon(nod)]<H[LeftSon(nod)] ) Son=RightSon(nod);
if (H[Son]>=H[nod]) Son=0;
}
if (Son)
{
int x=w[nod],y=w[Son];
swap(w[nod],w[Son]);
v[x]=Son; v[y]=nod;
swap(H[nod],H[Son]);
nod=Son;
}
} while(Son);
}
inline void Percolate(int H[], int n,int nod)
{
int key=H[nod],V=v[w[nod]],W=w[nod];
while (nod>1 && key<H[Father(nod)])
{
H[nod]=H[Father(nod)];
int i=w[Father(nod)];
v[i]=nod;
v[nod]=i;
nod=Father(nod);
}
H[nod]=key;
v[W]=nod;
w[nod]=V;
}
inline void DeleteHeap(int H[], int &n,int x)
{
int nod=v[x];
H[nod]=H[n];
--n;
if(nod>1 && H[nod]>H[Father(nod)])Percolate(H,n,nod);
else Sift(H,n,nod);
}
inline void InsertHeap(int H[], int &n,int key)
{
H[++n]=key;
nr++;
v[nr]=n;
w[n]=nr;
Percolate(H,n,n);
}
int main()
{
f>>N;
for(int i=1;i<=N;i++)
{
int tip;
f>>tip;
switch (tip)
{
case 1:
{
int key;
f>>key;
InsertHeap(H,n,key);
//g<<tip<<' '<<key<<':';
//for(int i=1;i<=n;i++)g<<H[i]<<' '; g<<'\n';g<<'\n';
break;
}
case 2:
{
int x;
f>>x;
DeleteHeap(H,n,x);
//g<<tip<<' '<<x<<':';
//for(int i=1;i<=n;i++)g<<H[i]<<' '; g<<'\n';g<<'\n';
break;
}
case 3:
{
g<<H[1]<<'\n';
//g<<tip<<' '<<':';
//for(int i=1;i<=n;i++)g<<H[i]<<' '; g<<'\n';g<<'\n';
break;
}
default: break;
}
}
f.close();g.close();
return 0;
}