Pagini recente » Cod sursa (job #1360649) | Borderou de evaluare (job #1424842) | Cod sursa (job #2925365)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[200001], h[200001], nr;
int father(int nod)
{
return nod/2;
}
int left_son(int nod)
{
return nod*2;
}
int right_son(int nod)
{
return nod*2+1;
}
void sift(int h[], int nr, int k)
{
int son, pson;
do
{
son=0;
if(left_son(k)<=nr)
{
son=left_son(k);
if(right_son(k)<=nr&&h[right_son(k)]<h[left_son(k)])
{
son=right_son(k);
}
if(h[son]>=h[k])
{
son=0;
}
}
if(son)
{
swap(v[k], v[son]);
swap(h[k], h[son]);
k=son;
}
}while(son);
}
void percolate(int h[], int nr, int k)
{
int crt=h[k];
while(k>1&&crt<h[father(k)])
{
h[k]=h[father(k)];
swap(v[k], v[father(k)]);
k=father(k);
}
h[k]=crt;
swap(v[k], v[nr]);
}
void cut(int h[], int &nr, int k)
{
h[k]=h[nr];
swap(v[k], v[nr]);
nr--;
if((k>1)&&(h[k]<h[father(k)]))
{
percolate(h, nr, k);
}
else
{
sift(h, nr, k);
}
}
int main()
{
int i=0, n, c, x;
fin>>n;
for(int j=1;j<=n;j++)
{
fin>>c;
if(c==1)
{
fin>>x;
i++;
v[i]=i;
nr++;
h[nr]=x;
percolate(h, nr, nr);
}
else
if(c==2)
{
fin>>x;
cut(h, nr, v[x]);
}
else
{
fout<<h[1]<<"\n";
}
/**for(int z=1;z<=nr;z++)
{
fout<<h[z]<<" ";
}
fout<<"\n";
for(int z=1;z<=nr;z++)
{
fout<<v[z]<<" ";
}
fout<<"\n";
fout<<"\n";**/
}
}