Pagini recente » Cod sursa (job #1355832) | Cod sursa (job #1031983) | Cod sursa (job #854715) | Cod sursa (job #2424734) | Cod sursa (job #2710116)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("heapuri.in");
ofstream g("heapuri.out");
int n,c,x,heapsize;
int heap[200001],pozitii[200001],v[200001];
/// implematare heap pe cursul de pe udemy
void push(int x)
{
heap[++heapsize] = x;
int pos = heapsize;
pozitii[x] = pos;
while(heapsize>1 && v[heap[pos]] < v[heap[pos/2]])
{
swap(heap[pos],heap[pos/2]);
/// dupa swap schimbam valorile atribuite
pozitii[heap[pos]] = pos;
pozitii[heap[pos/2]] = pos/2;
pos/=2;
}
}
void downHeap(int pos)
{
int largest = pos;
int pos1 = pos * 2;
int pos2 = pos * 2 +1;
if(pos1<=heapsize && v[heap[pos1]]<v[heap[largest]])
largest = pos1;
if(pos2 <= heapsize && v[heap[pos2]]<v[heap[largest]])
largest = pos2;
if(pos!=largest)
{
swap(heap[pos],heap[largest]);
pozitii[heap[pos]] = pos;
pozitii[heap[largest]] = pos;
downHeap(largest);
}
}
void pop(int x)
{
int pos = pozitii[x];
v[x] = -1;
heap[pos] = heap[heapsize--];
pozitii[heap[pos]] = pos;
downHeap(pos);
}
int main()
{
int cnt = 1;
f >> n;
for(int i = 1; i<=n; i++)
{
f >> c;
if(c == 1)
{
f >> v[cnt];
push(cnt);
cnt++;
}
else if(c == 2)
{
f >> x;
pop(x);
}
else
g << v[heap[1]]<< '\n';
}
}