Pagini recente » Cod sursa (job #1730005) | Cod sursa (job #2103304) | Cod sursa (job #1679114) | Cod sursa (job #1459546) | Cod sursa (job #2716087)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin ("heapuri.in") ;
ofstream cout ("heapuri.out") ;
/// este un arbore in care orice nod are informatia mai mica/ mai mare decat ambii copii
/// deci heap[f] < heap[2 * f] si heap[f] < heap[2 * f + 1]
/// cand se adauga un elem nou acesta se pune pe prima poz disponibila
/// daca nu urmeaza conditia heapului atunci se parcurge creanga curenta si se da swap intre nodul curent si tatal sau
/*
int heap[1009], poz[1009], poz_reciproc[1009], v[1009] ;
/// poz[x] este in numar intre 1 si n si este poz in vectorul initial a elementului care este in poz x in heap
/// poz_reciproc[x] este pozitia in heap pe care o are elementul cu indicele x in n
void update_heap(int indice_nod_curent, int x, int f) /// indice_... este indicele in heap, f este indicele in vectorul v
{
/// nod curent zice pozitia in poz a nodului curent
/// daca nodula curent nu exista macar in
if(x < heap[indice_nod_curent]) /// x va da overtake la acest nod
{
if(heap[2 * indice_nod_curent] < heap[2 * indice_nod_curent + 1] || !poz[2 * indice_nod_curent + 1]) /// verificam as fie macar in heap acest nod
{
/// merge pe stanga
update_heap(2 * indice_nod_curent, heap[indice_nod_curent], poz[2 * indice_nod_curent])
heap[indice_nod_curent] = x ;
poz_reciproc[f] = indice_nod_curent ;
return ;
}
else
{
/// merge pe dreapta
update_heap(2 * indice_nod_curent + 1, heap[indice_nod_curent], poz[2 * indice_nod_curent + 1])
heap[indice_nod_curent] = x ;
poz_reciproc[f] = indice_nod_curent ;
return ;
}
}
else /// x se va duce in jos pe o ramura, pe ramura cu elementul mai mare
{
if(heap[2 * indice_nod_curent] > heap[2 * indice_nod_curent + 1] || !poz[2 * indice_nod_curent + 1])/// verificam as fie macar in heap acest nod
{
/// merge pe stanga
update_heap(2 * indice_nod_curent, x, f) ;
return ;
}
else
{
/// merge pe dreapta
update_heap(2 * indice_nod_curent + 1, x, f) ;
return ;
}
}
}
*/
priority_queue<pair<int, int> > pq ;
int frecv[200009] ;
int main()
{
int n, f = 1 ;
cin >> n ;
while(n --)
{
int a, b, c ;
cin >> a ;
if(a == 1)
{
cin >> b ;
pq.push({b * -1, f ++}) ;
}
if(a == 2)
{
cin >> b ;
frecv[b] = 1 ;
}
if(a == 3)
{
while(frecv[pq.top().second])pq.pop() ;
cout << pq.top().first * (-1) << "\n" ;
}
}
return 0;
}