Pagini recente » Cod sursa (job #131374) | Cod sursa (job #1688033) | Cod sursa (job #2561318) | Cod sursa (job #1011492) | Cod sursa (job #2891106)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[200005], poz[200005], heap[200005], dimensiune = 0, element = 0;
void heapify(int x)
{
while(x/2 > 0 && v[heap[x]] < v[heap[x/2]])
{
swap(heap[x], heap[x/2]);
poz[heap[x]] = x;
poz[heap[x/2]] = x/2;
x /= 2;
}
}
void downify(int x)
{
while(2*x <= dimensiune) // daca are minim un nod
{
int kid1 = 2*x;
int kid2 = 2*x + 1;
if(2*x + 1 <= dimensiune) //sunt 2 noduri
{
if(v[heap[x]] < v[heap[kid1]] && v[heap[x]] < v[heap[kid2]]) // daca e cel mai mic ramane asa
{
break;
}
else
{
if(v[heap[kid1]] < v[heap[kid2]]) //daca e primu mai mic ca celalalt
{
swap(heap[x], heap[kid1]);
poz[heap[x]] = x;
poz[heap[kid1]] = kid1;
x = kid1;
}
else
{
swap(heap[x], heap[kid2]);
poz[heap[x]] = x;
poz[heap[kid2]] = kid2;
x = kid2;
}
}
}
else //e un singur nod
{
if(v[heap[x]] <= v[heap[kid1]])
break;
else
{
swap(heap[x], heap[kid1]);
poz[heap[x]] = x;
poz[heap[kid1]] = kid1;
x = kid1;
}
}
}
}
void deletion(int x)
{
int deletepoz = poz[x];
swap(heap[deletepoz], heap[dimensiune]);
poz[heap[deletepoz]] = deletepoz;
poz[heap[dimensiune]] = dimensiune;
dimensiune--;
int tata = deletepoz / 2;
if(deletepoz == 1 || v[heap[tata]] < v[heap[deletepoz]])
downify(deletepoz);
else
heapify(deletepoz);
}
int main()
{
int n,i,j,k,nr, index = 1,tip;
fin>>n;
for(i=1;i<=n;i++)
{
fin>>tip;
if(tip == 1)
{
fin>>nr;
dimensiune ++;
element++;
heap[dimensiune] = element;
v[element] = nr;
poz[element] = dimensiune;
heapify(dimensiune);
}
else if(tip == 2)
{
fin>>nr;
deletion(nr);
}
else if(tip == 3)
{
fout<<v[heap[1]]<<'\n';
}
}
return 0;
}