Pagini recente » Cod sursa (job #1846721) | Cod sursa (job #2506892) | Cod sursa (job #822035) | Cod sursa (job #951506) | Cod sursa (job #2401394)
#include <bits/stdc++.h>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int N = 200010;
int n,x[N],p[N],h[N],op,k,m,poz,i;
void heap_swap(int,int),heap_up(int),heap_down(int);
int main()
{
f>>n;
for(;n;n--)
{
f>>op;
if(op==1)
{
f>>x[++k];
m++; /// m = mumarul de elemente din heap
/// in heap inserez timpul k la care a intrat valoarea -> am acces la valoare ( = x[k] )
p[k]=m; /// p[k] = pozitia in heap pentru elementul intrat la momentul k
h[m]=k; /// h[] = heap-ul cu semnificatia h[i] = k daca in heap pe pozitia i am elementul intrat la momentul k
/// de fapt in h tin momentul dar prin el am imediat acces la valoare ( valoare[i] = x[h[i]] )
heap_up(m);
}
if(op==2)
{
f>>i; /// se citete un timp de intrare
poz=p[i]; /// se localizeaza in ce pozitie din heap avem acel timp
heap_swap(poz,m); /// se interschimba in heap acel timp cu cel de pe ultima pozitie
m--; /// se "scurteaza" heap-ul cu un element - exact cel care trebuie eliminat
heap_up(poz);
heap_down(poz); /// cele doua apeluri rearanjeaza heap-ul
}
if(op==3)
g<<x[h[1]]<<'\n';
}
return 0;
}
void heap_swap(int a,int b)
{
swap(h[a],h[b]);
p[h[a]]=a;p[h[b]]=b;
}
void heap_up(int fiu)
{
int tata=fiu/2;
if(!tata)return;
if(x[h[tata]]<=x[h[fiu]])return;
heap_swap(tata,fiu);heap_up(tata);
}
void heap_down(int tata)
{
int fiu=2*tata;
if(fiu>m)return;
if(fiu<m)if(x[h[fiu+1]]<x[h[fiu]])fiu++;
if(x[h[fiu]]<x[h[tata]]){heap_swap(tata,fiu);heap_down(fiu);}
}