Pagini recente » Cod sursa (job #989818) | Cod sursa (job #2052085) | Rating Viorel Timar (vticj) | Cod sursa (job #2021120) | Cod sursa (job #1288372)
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int nmax = 200000;
int h[nmax + 1] , v[nmax + 1] , poz[nmax + 1];
int n , nh;
void schimba(int i1 , int i2)
{
int aux = h[i1];
h[i1] = h[i2];
h[i2] = aux;
poz[h[i1]] = i1;
poz[h[i2]] = i2;
}
void urca(int i)
{
while(i >= 2 && v[h[i]] < v[h[i / 2]])
{
schimba(i , i / 2);
i /= 2;
}
}
void coboara(int i)
{
int fs = 2 * i , fd = 2 * i + 1 , bun = i;
if(fs <= nh && v[h[fs]] < v[h[bun]])
bun = fs;
if(fd <= nh && v[h[fd]] < v[h[bun]])
bun = fd;
if(bun != i)
{
schimba(i , bun);
coboara(bun);
}
}
int main()
{
in >> n;
int op , nr = 0 , elem;
nh = 0;
for(int i = 1 ; i <= n ; i++)
{
in >> op;
if(op == 1)
{
in >> v[++nr];
h[++nh] = nr;
poz[h[nh]] = nh;
urca(nh);
}
else if(op == 2)
{
in >> elem;
elem = poz[elem];
schimba(elem , nh--);
urca(elem);
coboara(elem);
}
else
out << v[h[1]] << '\n';
}
return 0;
}