Pagini recente » Cod sursa (job #2436123) | Cod sursa (job #229138) | Cod sursa (job #1250723) | Cod sursa (job #3166116) | Cod sursa (job #1300390)
#include <fstream>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int N, t, val, nr, cr, num, A[200010], Poz[200010], V[200010];
void Insert_Heap(int x)
{
int fiu = ++nr;
int tata = nr / 2;
V[nr] = x;
while (tata && V[tata] > x)
{
swap(Poz[V[fiu]], Poz[V[tata]]);
V[fiu] = V[tata];
V[tata] = x;
fiu = tata;
tata = fiu / 2;
}
}
void Erase_Heap(int x)
{
swap(V[Poz[x]], V[nr]);
swap(Poz[V[nr--]], Poz[x]);
int v = V[Poz[x]];
int tata = Poz[x], fiu = Poz[x] * 2;
while (fiu <= nr)
{
if (fiu < nr && V[fiu] > V[fiu + 1]) fiu += 1;
if (V[fiu] < v)
{
swap(Poz[V[tata]], Poz[V[fiu]]);
V[tata] = V[fiu];
V[fiu] = v;
tata = fiu;
fiu = tata * 2;
}
else
{
fiu = nr + 1;
}
}
}
int Extract_Min()
{
return V[1];
}
int main()
{
fin >> N;
for (int i = 1; i <= N; i++)
{
fin >> t;
switch (t)
{
case 1 :
{
fin >> val;
A[++num] = val;
Poz[val] = num;
Insert_Heap(val);
break;
}
case 2 :
{
fin >> val;
Erase_Heap(A[val]);
break;
}
case 3 :
{
fout << Extract_Min() << '\n';
break;
}
}
}
fout.close();
return 0;
}