Pagini recente » Cod sursa (job #3127876) | Cod sursa (job #640680) | Cod sursa (job #657669) | Cod sursa (job #122748) | Cod sursa (job #3220316)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int salvare_pozitie[200005];
int salvare_pozitie_introducere[200005];
int heap[200005];
int op;
int n, k, m;
void make_heap(int nod)
{
while (nod > 1)
{
int p = nod / 2;
if (heap[p] < heap[nod])
return;
else
{
swap(heap[p], heap[nod]);
salvare_pozitie[salvare_pozitie_introducere[p]]=nod;
salvare_pozitie[salvare_pozitie_introducere[nod]]=p;
swap(salvare_pozitie_introducere[p],salvare_pozitie_introducere[nod]);
nod = p;
}
}
}
void remake_heap(int nod)
{
while (2 * nod <= k)
{
int p = 2 * nod;
if (p + 1 <= k && heap[p + 1] < heap[p])
p++;
if (heap[nod] < heap[p])
return;
else
{
swap(heap[nod], heap[p]);
salvare_pozitie[salvare_pozitie_introducere[p]]=nod;
salvare_pozitie[salvare_pozitie_introducere[nod]]=p;
swap(salvare_pozitie_introducere[p],salvare_pozitie_introducere[nod]);
nod=p;
}
}
}
int main()
{
fin >> m;
for (; m--;)
{
fin >> op;
if (op == 1)
{
int x;
n++;
k++;
fin >> x;
salvare_pozitie[n] = k;
///salvez pozitia elementului ce a fost introdus la momentul n
salvare_pozitie_introducere[k] = n;
///salvez momentul la care a fost introdus elementul de pe pozitia k
heap[k] = x;
make_heap(k);
///adaug in heap
}
else if (op == 2)
{
int x;
fin >> x;
/*for(int i=1;i<=n;i++)
cout<<salvare_pozitie_introducere[i]<<" ";
cout<<'\n';*/
heap[salvare_pozitie[x]] = heap[k];
///schimb elementul ce a fost introdus la momentul x
swap(salvare_pozitie_introducere[salvare_pozitie[x]],salvare_pozitie[salvare_pozitie_introducere[k]]);
///cout<<salvare_pozitie[x]<<" ";
///cout<<'\n';
k--;
remake_heap(salvare_pozitie[x]);
}
else fout<<heap[1]<<'\n';
}
}