Cod sursa(job #2104052)
Utilizator | Data | 11 ianuarie 2018 02:11:28 | |
---|---|---|---|
Problema | Heapuri | Scor | 20 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.15 kb |
#include <fstream>
#include <algorithm>
#define MA 200005
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int nro,tip,x,poz,nh,i,s,p,ult;
int d;
/// s- cate elemente cronologic
struct H
{
int h,t; /// t este timpul cronologic
} H[MA];
int main()
{
fin>>nro;
for(int op=1; op<=nro; op++)
{
fin>>tip;
if(tip==1) //Percolate
{
fin>>H[++i].h; ///La final, i va reprezenta nr de elemente din Heap
H[i].t=++s;
poz=nh=i;
while(1)
{
if(poz==1)
break;
p=(poz>>1); /// Aici impartim la 2, adica mergem la tatal sau sa vedem daca este mai mic
if(H[poz].h<H[p].h) /// Daca parintele este mai mic decat elementul nou
{
swap(H[poz].h,H[p].h);
swap(H[poz].t,H[p].t);
poz=p;
}
else break;
}
}
else if(tip==2)
{
fin>>x;
if(i==x)
ult=i-1;
else ult=i;
int l;
for(l=1; l<=i; l++)
if(H[l].t==x)
{
poz=l;
while (1) //il aducem sus
{
if (poz==1)
break;
p=(poz>>1);
swap(H[poz].h,H[p].h);
swap(H[poz].t,H[p].t);
poz=p;
}
//Schimbam primul cu ultimul
H[1].h=H[ult].h;
H[1].t=H[ult].h; //sift
H[ult].h=0;
H[ult].h=0;
i--;
poz=1;
while(1)
{
if((poz<<1)>i)
break;
else
{
d=poz<<1;
if(d+1<=i)
if(H[d+1].h<H[d].h)
d=d+1;
if(H[poz].h>H[d].h)
{
swap(H[poz].h,H[d].h);
swap(H[poz].t,H[d].t);
poz=d;
}
else break;
}
}
break;
}
}
else
fout<<H[1].h<<"\n";
}
fin.close();
fout.close();
return 0;
}