Pagini recente » Cod sursa (job #1108802) | Cod sursa (job #2103342) | Rating Coroi Miruna Elena (mirunacoroi) | Cod sursa (job #1134681) | Cod sursa (job #1423118)
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
const int DIMENSION = 200001;
int Heap[DIMENSION];
int size = 0;
int Position[DIMENSION];
int Order[DIMENSION];
int nr_elements = 0;
void insert(int x)
{
++nr_elements;
++size;
Heap[size]=x;
Position[nr_elements]=size;
Order[size]=nr_elements;
int aux=size;
while( (aux/2) !=0 && Heap[aux]<Heap[aux/2])
{
swap(Position[Order[aux]],Position[Order[aux/2]]);
swap(Order[aux],Order[aux/2]);
swap(Heap[aux],Heap[aux/2]);
aux=aux/2;
}
}
void remove(int ord)
{
int pos = Position[ord];
swap(Heap[Position[ord]],Heap[size]);
swap(Position[Order[pos]],Position[Order[size]]);
swap(Order[pos],Order[size]);
--size;
while( (pos/2)!=0 && Heap[pos] < Heap[pos/2] )
{
swap(Position[Order[pos]],Position[Order[pos/2]]);
swap(Order[pos],Order[pos/2]);
swap(Heap[pos],Heap[pos/2]);
pos=pos/2;
}
while(pos*2 <= size)
{
if(pos*2+1 <= size && Heap[pos*2+1] < Heap[pos] && Heap[pos*2+1] < Heap[pos*2])
{
swap(Position[Order[pos*2+1]],Position[Order[pos]]);
swap(Order[pos],Order[pos*2+1]);
swap(Heap[pos],Heap[pos*2+1]);
pos=pos*2+1;
}
else
if( (pos*2+1 <= size && Heap[pos*2] < Heap[pos] && Heap[pos*2] < Heap[pos*2+1]) || (pos*2+1 > size && Heap[pos*2] < Heap[pos]) )
{
swap(Position[Order[pos*2]],Position[Order[pos]]);
swap(Order[pos],Order[pos*2]);
swap(Heap[pos],Heap[pos*2]);
pos=pos*2;
}
else
break;
}
}
int show_min()
{
return Heap[1];
}
int main()
{
ifstream f("heapuri.in.txt");
ofstream g("heapuri.out");
int N,op,x;
f>>N;
cout<<N;
for(int i=0;i<N;i++)
{
f>>op;
cout<<op<<endl;
if(op==1)
{
f>>x;
insert(x);
}
if(op==2)
{
f>>x;
remove(x);
}
if(op==3)
{
g<<show_min()<<endl;
}
}
f.close();
g.close();
}