Pagini recente » Cod sursa (job #486974) | Cod sursa (job #1791639) | Cod sursa (job #2354480) | Cod sursa (job #770890) | Cod sursa (job #1577145)
//problema heapuri infoarena
#include <cstdio>
#define NMAX 200010
using namespace std;
struct pack
{
int inf;
int poz;
};
struct pack H[NMAX];
int n;
int inserare (struct pack[], int&, int);//insereaza nodul in heap si returneaza pozitia pe care a fost inserat
void sterge (struct pack[], int&, int);//sterge nodul de pe pozitia data din heap
void combinare(struct pack[], int, int);
int main()
{
FILE*fin=fopen ("heapuri.in", "r");
FILE*fout=fopen ("heapuri.out", "w");
int i, nrop, a, b, j;
fscanf(fin, "%d", &nrop);
for (i=1; i<=nrop; ++i)
{
fscanf(fin, "%d", &a);
if (a!=3) fscanf(fin, "%d", &b);
if (a==1)
{
j=inserare(H, n, b);
H[j].poz=i;
}
else
if (a==2)
{
for (j=1; j<=n; ++j)
if (H[j].poz==b)
{
sterge(H, n, j);
break;
}
}
else
fprintf(fout, "%d\n", H[1].inf);
}
fclose(fout);
return 0;
}
int inserare(struct pack H[NMAX], int& n, int x)
{
// heap-ul in care inserez, dimensiunea heap-ului, inserez val x
int fiu, tata;
fiu=++n; tata=fiu/2;
// tata=fiu>>1
while (tata && H[tata].inf>x)
{
H[fiu]=H[tata];
fiu=tata;
tata=fiu/2;
// tata=fiu>>1
}
H[fiu].inf=x;
return fiu;
}
void sterge (struct pack H[NMAX], int &n, int tata)//sterge nodul de pe pozitia data din heap
{
int fiu, x, aux;
x=H[n].inf; aux=H[n].poz;
H[tata].inf=x; H[tata].poz=aux;
--n;
//vad daca ma duc in sus sau in jos
if (tata/2 && H[tata].inf<H[tata/2].inf)
{
fiu=tata;
tata/=2;
x=H[fiu].inf;
while (tata && H[tata].inf<x)
{
H[fiu]=H[tata];
fiu=tata;
tata=fiu/2;
}
H[fiu].inf=x;
H[fiu].poz=aux;
}
else//o dam pe combinatii
combinare(H, n, tata);
}
void combinare(struct pack H[NMAX], int n, int i)
// se combina nodul H[i] cu Heapurile cu radacinile 2i si 2i+1, obtinand un nou heap cu radacina H[i]
{
int x=H[i].inf, tata, fiu;
int aux=H[i].poz;
tata=i; fiu=2*i;
while (fiu<=n)
{
if (fiu+1<=n && H[fiu+1].inf<H[fiu].inf) fiu++;
// fiu indica cel mai mic dintre fii
if (H[fiu].inf<x)
{
H[tata]=H[fiu];
tata=fiu;
fiu=tata*2;
}
else break;
}
H[tata].inf=x;
H[tata].poz=aux;
}