Pagini recente » Cod sursa (job #306396) | Cod sursa (job #758634) | Cod sursa (job #220247) | Cod sursa (job #1615154) | Cod sursa (job #2294106)
#include <iostream>
#include <fstream>
using namespace std;
const int N = 200010;
int dim, m;
struct Tip
{
int info, poz;
} v[N];
void afis()
{
int i;
cout << "info\n";
for( i=0 ; i< dim; i++)
cout << v[i].info << " ";
cout << "\n";
cout << "poz\n";
for( i=0 ; i< dim; i++)
cout << v[i].poz << " ";
cout << "\n";
}
void heapify( int root )
{
//Determinam minimul dintre root si cei 2 fii ai sai
int minimum = root;
int lc = 2*root ;
int rc = 2*root + 1;
if (lc < dim && v[lc].info < v[minimum].info)
minimum = lc;
if (rc < dim && v[rc].info < v[minimum].info)
minimum = rc;
//Daca unul dintre cei 2 fii contine o valoarea mai mare decat cea din radacina,
//interschimbam cele doua valori si refacem structura de heap a subarborelui fiului respectiv
if (minimum != root)
{
swap(v[root], v[minimum]);
heapify( minimum);
}
}
//Functie care sorteaza un tablou v format din n elemente
void heapSort( )
{
//Se construieste heap-ul initial
for (int i = dim/2-1; i >= 0; i--)
heapify(i);
//De n ori efectuam urmatoarele operatii
for (int i = dim-1; i >= 0; i--)
{
//Interschimbam valoarea minima din heap (v[0])
//cu ultima valoare din subarborele curemt (v[i])
swap(v[0], v[i]);
//Refacem structura de heap a arborelui redus
heapify( 0);
}
}
void adaugare( int x )
{
v[dim].info = x;
v[dim++]. poz = m++;
}
void stergere ( int x)
{
int i, j;
x--;
for ( j = 0 ; j < dim ; j++)
if(v[j].poz == x)
{
i = j;
break;
}
dim --;
for ( ; i < dim; i++ )
v[i] = v[i+1];
heapify( 0 );
//afis ();
}
int minim()
{
heapSort();
return v[0].info ;
}
int main()
{
ifstream in("heapuri.in");
ofstream out( "heapuri.out");
int n, op, i, x;
in >> n;
for (i = 0; i < n; i++)
{
in >> op ;
if ( op == 3)
out << minim () << "\n";
else
{
in >> x;
if ( op == 1)
adaugare ( x );
else
stergere ( x );
}
}
in.close();
out.close();
return 0;
}