Pagini recente » words | Rating Comisie Juniori Vianu - ICHB (comisie_baraj_shumen_ichb_vianu_juniori) | saseg | Monitorul de evaluare | Cod sursa (job #755506)
Cod sursa(job #755506)
#include <fstream>
#include <iostream>
using namespace std;
const int MAX_N=200002;
int heap[MAX_N];
int heaps;
int pos[MAX_N]; /* pos[k] spune pozitia elementului k in heap */
int timeline[MAX_N]; /** timeline[k] spune ce element a intrat la timpul k*/
void swap_heaps(int node1,int node2)
{
swap(pos[node1],pos[node2]);
swap(heap[pos[node1]],heap[pos[node2]]);
}
void promote_heap(int val);
void push_heap(int val)
{
heaps++;
heap[heaps] = val;
pos[val] = heaps;
promote_heap(val);
}
void promote_heap(int val)
{
int elem = pos[val];
while(1)
{
if(elem == 1)
break;
int tatal = elem/2;
if(heap[tatal] > heap[elem])
{
swap_heaps(heap[tatal],heap[elem]);
elem = tatal;
}
else
break;
}
}
void demote_heap(int element)
{
int pose = pos[element];
while(1)
{
int stanga = pose*2;
int dreapta = pose*2+1;
if(stanga <= heaps)
if(heap[pose] > heap[stanga])
{
swap_heaps(heap[pose],heap[stanga]);
pose = stanga;
continue;
}
if(dreapta <= heaps)
if(heap[pose] > heap[dreapta])
{
swap_heaps(heap[pose],heap[dreapta]);
pose = dreapta;
continue;
}
if(dreapta >= heaps && stanga >=heaps)
break;
break;
}
}
void pop_heap(int element)
{
if(heaps == 1)
{
heaps--;
return ;
}
int pozitie = pos[element];
swap_heaps(element,heap[heaps]);
heaps--;
if(pozitie == 1)
{
demote_heap(heap[pozitie]);
return ;
}
int parent = pozitie / 2;
if(heap[parent] > heap[pos[element]])
promote_heap(heap[pozitie]);
else
demote_heap(heap[pozitie]);
}
int main()
{
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n;
fin>>n;
int timp = 1;
for(int i = 1; i<=n; i++)
{
int id,val;
fin>>id;
if(id == 1)
{
fin>>val;
push_heap(val);
timeline[timp] = val;
timp++;
}
else if(id == 2)
{
fin>>val;
pop_heap(timeline[val]);
}
else if(id == 3)
fout<<heap[1]<<endl;
}
/*for(int i = 1; i<=heaps; i++)
cout<<heap[i]<<" ";
cin.sync();
cin.get();*/
return 0;
}