Pagini recente » Cod sursa (job #1685994) | Cod sursa (job #1317945) | Cod sursa (job #219961) | Cod sursa (job #2214683) | Cod sursa (job #1576988)
//problema heapuri infoarena
#include <cstdio>
#define NMAX 200010
using namespace std;
int n, H[NMAX];
int timeline[NMAX];//timeline[i]=pozitia pe care se afla al i-lea nod inserat in ordine cronologica
int inserare (int[], int&, int);//insereaza nodul in heap
void sterge (int[], int&, int);//sterge nodul de pe pozitia data din heap
int main()
{
FILE*fin=fopen ("heapuri.in", "r");
FILE*fout=fopen ("heapuri.out", "w");
int i, nrop, a, b;
fscanf(fin, "%d", &nrop);
for (i=1; i<=nrop; ++i)
{
fscanf(fin, "%d %d", &a, &b);
if (a==1)
timeline[i]=inserare (H, n, b);
else
if (a==2)
sterge (H, n, timeline[b]);
else
fprintf(fout, "%d\n", H[1]);
}
fclose(fout);
return 0;
}
int inserare (int H[NMAX], int &n, int x)//functia returneaza pozitia pe care am introdus nodul x
{
//il pun mai intai la sfarsit
int tata, fiu;
fiu=++n; tata=fiu/2;
while (tata && H[tata]>x)
{
H[fiu]=H[tata];
fiu=tata;
tata/=2;
}
//la sfarsit, introduc nodul x pe pozitia tata
H[fiu]=x;
return fiu;
}
void sterge (int H[NMAX], int &n, int tata)
{
//ma duc in jos pana scap de nodul de pe pozitia poz
int fiu, i;
fiu=2*tata;
while(tata)
{
if (H[fiu+1] && H[fiu+1]<H[fiu]) ++fiu;
H[tata]=H[fiu];
tata=fiu;
fiu=tata*2;
}
tata/=4;//daca am sters nodul din stanga si nodul are si fiu in dreapta, mut nodul din dreapta in stanga
if (H[tata*2]==0 && H[tata*2+1]!=0)
{
H[tata*2]=H[tata*2+1];
H[tata*2+1]=0;
}
return;
}