Pagini recente » Cod sursa (job #882085) | ONIS 2014, Clasament Runda 1 | Cod sursa (job #1581221) | Cod sursa (job #536660) | Cod sursa (job #1578035)
#include <cstdio>
using namespace std;
//ifstream fin("heapuri.in");
//ofstream fout("heapuri.out");
FILE *fin = fopen("heapuri.in", "r");
FILE *fout = fopen("heapuri.out", "w");
int x, i, cod, n, elem;
struct fr
{
int inf;
int nr;
}H[200010];
void inserez(int);
void sterg(int);
void afisez();
void combinare(int i);
int main()
{
fscanf(fin, "%d", &n);//fin >> n;
for(i = 1; i <= n; ++i)
{
fscanf(fin, "%d", &cod);//fin >> cod;
if(cod == 1)
{
fscanf(fin, "%d", &x);//fin >> x;
inserez(x);
}
else
if(cod == 2)
{
fscanf(fin, "%d", &x);//fin >> x;
sterg(x);
}
else
afisez();
}
return 0;
}
void inserez(int x)
{
int i;
int fiu, tata;
fiu = ++elem;
tata = fiu/2;
while(tata > 0 && H[tata].inf > x)
{
H[fiu] = H[tata];
fiu = tata;
tata = tata/2;
}
H[fiu].inf = x;
H[fiu].nr = elem;
}
void sterg(int x)
{
int i;
for(i = 1; i <= elem; ++i)
if(H[i].nr == x)
break;
H[i] = H[elem];
elem--;
combinare(i);
}
void afisez()
{
fprintf(fout, "%d\n", H[1].inf);//fout << H[1].inf << '\n';
}
void combinare(int i)
{
int x = H[i].inf, tata = i, fiu = 2*i;
while(fiu <= elem)///cat timp mai exista fii
{
if(fiu+1 <= elem && H[fiu].inf > H[fiu+1].inf)
fiu++;
if(H[fiu].inf < x)
{
///promovez pe cel mai mic dintre fii
H[tata] = H[fiu];
tata = fiu;
fiu = 2*tata;
}
else///am gasit locul, ies
break;
}
H[tata].inf = x;
H[tata].nr = H[i].nr;
}