Pagini recente » Cod sursa (job #356252) | Cod sursa (job #2890601) | Cod sursa (job #2408834) | Cod sursa (job #2339313) | Cod sursa (job #572835)
Cod sursa(job #572835)
#include<fstream>
#define nmax 200010
using namespace std;
int h[nmax],v[nmax],a[nmax];
int n;
int fiust(int nod){ return 2*nod; }
int fiudr(int nod){ return 2*nod+1; }
int tata (int nod){ return nod/2; }
ofstream out("heapuri.out");
void jos(int k)
{
int fiu;
do
{
fiu =0;
if (fiust(k)<=n)
fiu=fiust(k);
if (h[fiust(k)]>h[fiudr(k)]&&fiudr(k)<=n)
fiu=fiudr(k);
if (h[fiu]>=h[k])
fiu=0;
else if (fiu)
{
swap(h[fiu],h[k]);
swap(v[a[fiu]],v[a[k]]);
swap(a[fiu],a[k]);
k=fiu;
}
}while (fiu);
}
void sus(int k)
{
while (k>1&&h[k]<h[tata(k)])
{
swap(h[k],h[tata(k)]);
swap(v[a[k]],v[a[tata(k)]]);
swap(a[k],a[tata(k)]);
k=tata(k);
}
}
void afis()
{
int i;
for (i=1;i<=n;i++)
out<<h[i]<<' ';
out<<'\n';
for (i=1;i<=n;i++)
out<<v[i]<<" ";
out<<'\n';
for (i=1;i<=n;i++)
out<<a[i]<<" ";
out<<"\n\n";
}
int main()
{
int op,m,x,l=0,j;
ifstream in("heapuri.in");
in>>m;
for (j=1;j<=m;j++)
{
in>>op;
if (op<3)
{
in>>x;
if (op==1)
{
n++;
l++;
v[l]=n;
a[n]=l;
h[n]=x;
sus(n);
}
else if (op==2)
{
h[v[x]]=h[n];
a[v[x]]=a[n];
v[a[n]]=v[x];
n--;
if (h[v[x]]<h[tata(v[x])])
sus(v[x]);
else
jos(v[x]);
}
}
else
{
out<<h[1]<<'\n';
//afis();
}
}
}