Pagini recente » Cod sursa (job #2428703) | Cod sursa (job #71642) | Cod sursa (job #1549060) | Cod sursa (job #2431942) | Cod sursa (job #661746)
Cod sursa(job #661746)
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int maxn=200010;
int heap[maxn],poz[maxn],val[maxn],n,lung,N;
void swap(int i,int j)
{
int aux=heap[i];
heap[i]=heap[j];
heap[j]=aux;
}
void urca(int nod)
{
while(nod>1&& val[heap[nod]]<val[heap[nod/2]]) // nod/2 indica tatalif
{
swap(nod,nod/2);
poz[heap[nod]]=nod;
poz[heap[nod/2]]=nod/2;
nod=nod/2;
}
}
void coboara(int nod)
{
while((nod*2<=N && val[heap[nod*2]]<val[heap[nod]])||(nod*2+1<=N && val[heap[nod*2+1]]<val[heap[nod]]))
{
if(nod*2+1<=N)
{
if(val[heap[nod*2]]<val[heap[nod*2+1]])
{
swap(nod,nod*2);
poz[heap[nod]]=nod;
poz[heap[nod*2]]=nod*2;
nod=nod*2;
}
else
{
swap(nod,nod*2+1);
poz[heap[nod]]=nod;
poz[heap[nod*2+1]]=nod*2+1;
nod=nod*2+1;
}
}
else
{
swap(nod,nod*2);
poz[heap[nod]]=nod;
poz[heap[nod*2]]=nod*2;
nod=nod*2;
}
}
}
void push(int x)
{
lung++;
val[lung]=x;
N++;
heap[N]=lung;
poz[lung]=N;
urca(N);
}
void pop(int x)
{
val[x]=-1;
urca(poz[x]);
poz[heap[1]]=0;
heap[1]=heap[N--];
poz[heap[1]]=1;
if(N>1) coboara(1);
}
int main()
{
f>>n;
for(;n;n--)
{
int op,x;
f>>op;
if(op==1)
{
f>>x;
push(x);
}
if(op==2)
{
f>>x;
pop(x);
}
if(op==3)
g<<val[heap[1]]<<"\n";
}
return 0;
}