Cod sursa(job #1968874)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 17 aprilie 2017 22:24:02
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<fstream>
using namespace std;
int n,x,y,v[200001],w[200001],aux,u[200001];
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int main()
{f>>n;
for(int i=1;i<=n;i++)
{f>>x;
if(x==1)
{f>>y;
v[++v[0]]=y;
w[++w[0]]=v[0];
u[v[0]]=w[0];
aux=w[0];
while(aux>1&&v[w[aux]]<v[w[aux/2]])
{swap(w[aux],w[aux/2]);
u[w[aux]]=aux;
u[w[aux/2]]=aux/2;
aux/=2;
}
}
else if(x==2)
{f>>y;
aux=u[y];
w[aux]=w[w[0]];
w[0]--;
while(aux>1&&v[w[aux]]<v[w[aux/2]])
{swap(w[aux],w[aux/2]);
u[w[aux]]=aux;
u[w[aux/2]]=aux/2;
aux/=2;
}
while((2*aux<w[0]&&v[w[aux]]>min(v[w[2*aux]],v[w[2*aux+1]]))||(2*aux==w[0]&&v[w[aux]]>v[w[2*aux]]))
if(2*aux+1>w[0]||v[w[2*aux]]<=v[w[2*aux+1]])
{swap(w[aux],w[2*aux]);
u[w[aux]]=aux;
u[w[2*aux]]=2*aux;
aux*=2;
}
else
{swap(w[aux],w[2*aux+1]);
u[w[aux]]=aux;
u[w[2*aux+1]]=2*aux+1;
aux=2*aux+1;
}
}
else
g<<v[w[1]]<<'\n';
}
return 0;
}