Pagini recente » Cod sursa (job #1172576) | Istoria paginii runda/franceza/clasament | Cod sursa (job #2143821) | Cod sursa (job #728843) | Cod sursa (job #1835796)
#include <fstream>
#include <algorithm>
#define NM 200005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int heap[NM], poz[NM], n, ord[NM], ordin;
void coboara(int k)
{
int son;
do
{
son = 0;
if((k << 1) <= n)
{
son = k << 1;
if(heap[ (k << 1) + 1 ] < heap[ son ] && (k << 1) + 1 <= n)
son = (k << 1) + 1;
if(heap[son] > heap[k]) son = 0;
}
if(son)
{
swap(heap[ k ], heap[ son ]);
swap(ord[ k ], ord[ son ]);
swap(poz[ ord[ k ] ], poz[ ord[ son ] ]);
k = son;
}
}
while(son);
}
void urca(int k)
{
while(k > 1 && heap[ k ] < heap[ k >> 1 ])
{
swap(ord[ k ], ord[ k >> 1 ]);
swap(heap[ k ], heap[ k >> 1 ]);
swap(poz[ ord[k] ], poz[ ord[k >> 1] ]);
k >>= 1;
}
}
void insereaza(int val)
{
ord[ ++n ] = ++ordin;
heap[n] = val;
poz[ ordin ] = n;
urca(n);
}
void sterge(int k)
{
heap[ k ] = heap[ n ];
ord[ k ] = ord[ n ];
poz[ ord[ n-- ] ] = poz[ k ];
if(k > 1 && heap[ k ] < heap[ k >> 1 ]) urca(k);
else coboara(k);
}
int main()
{
int q, cod, x;
f >> q;
for(int i = 1; i <= q; ++i)
{
f >> cod;
if(cod == 1)
{
f >> x;
insereaza(x);
}
if(cod == 2)
{
f >> x;
sterge(poz[x]);
}
if(cod == 3) g << heap[ 1 ] << '\n';
}
}