Pagini recente » Cod sursa (job #3036625) | Cod sursa (job #2663745) | Cod sursa (job #166204) | Cod sursa (job #2729690) | Cod sursa (job #464995)
Cod sursa(job #464995)
#include <iostream>
#include <fstream>
#define NMAX 200001
using namespace std;
long n;
fstream fin,fout;
long heap[NMAX];
long lg;
long v[NMAX];
void adauga(long el)
{
lg++;
heap[lg]=el;
long p=lg;
while(heap[p]<heap[p/2] && p>1)
{
long aux=heap[p];
heap[p]=heap[p/2];
heap[p/2]=aux;
p=p/2;
}
}
long cauta(long el, long poz)
{
if(heap[poz]==el)
return poz;
else
{
if(heap[poz*2]>heap[poz])
return cauta(el,poz*2);
if(heap[poz*2+1]>heap[poz])
return cauta(el,poz*2+1);
}
return -1;
}
void swap(long poz1, long poz2)
{
long aux = heap[poz1];
heap[poz1]=heap[poz2];
heap[poz2]=aux;
}
void sterge(long el)
{
long poz = cauta(el,1);
long min_poz=0;
heap[poz]=heap[lg];
lg--;
while(poz<=lg && (heap[poz] > heap[poz*2] || heap[poz]>heap[poz*2+1]))
{
if(poz*2<=lg && poz*2+1<=lg)
{
if(heap[poz*2]<heap[poz*2+1])
min_poz=poz*2;
else
min_poz=poz*2+1;
if(heap[poz]>heap[min_poz])
swap(poz,min_poz);
}
else
if(poz*2<=lg && poz*2+1>lg)
{
if(heap[poz*2]<heap[poz])
swap(poz*2,poz);
return;
}
else
if(poz*2>lg && poz*2+1<=lg)
{
if(heap[poz*2+1]<heap[poz])
swap(poz*2+1,poz);
return;
}
poz=min_poz;
}
}
void minim()
{
fout<<heap[1]<<'\n';
}
void citire()
{
int cod;
long element;
fin>>n;
for(long i=0;i<n;i++)
{
fin>>cod;
switch(cod)
{
case 1:
fin>>element;
v[++v[0]]=element;
adauga(element);
break;
case 2:
fin>>element;
sterge(v[element]);
break;
case 3:
minim();
break;
}
}
}
int main()
{
fin.open("heapuri.in",ios::in);
fout.open("heapuri.out",ios::out);
citire();
fin.close();
return 0;
}