Pagini recente » Cod sursa (job #2216556) | Cod sursa (job #212570) | Cod sursa (job #2246445) | Cod sursa (job #1392380) | Cod sursa (job #427717)
Cod sursa(job #427717)
#include<fstream.h>
#include<math.h>
#define endl '\n'
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct nod{int p,x;};
nod v[200010];
int niv[200010],n,u;
int intmin(int i){
if(2*i+1<=n)
if(v[2*i].x<v[2*i+1].x)
return 2*i;
else return 2*i+1;
else return 2*i;
}
void inversare(int i){
int fiumin;
nod aux;
u=i;
if(i<=n/2){
fiumin=intmin(i);
if(v[i].x>v[fiumin].x){
niv[v[i].p]++;
niv[v[fiumin].p]--;
aux=v[i];
v[i]=v[fiumin];
v[fiumin]=aux;
inversare(fiumin);
}
}
}
void up(int t){
int p;
nod aux;
if(t>1){
p=t/2;
if(v[p].x>v[t].x){
niv[v[p].p]++;
niv[v[t].p]--;
aux=v[p];
v[p]=v[t];
v[t]=aux;
up(p);
}
}
}
void addnod(int k,int x){
v[n].x=x;
v[n].p=k;
niv[k]=log2(n);
up(n);
}
void sterge(int p){
int i;
int nivel=niv[p];
for(i=(1<<nivel);i<(1<<(nivel+1))&&i<=n;i++){
if(v[i].p==p) break;
}
v[i].x=1<<30;
inversare(i);
v[u]=v[n];
n--;
up(u);
}
int main(){
int i,q,x,p,k=0,o;
fin>>q;
for(i=1;i<=q;i++){
fin>>o;
switch (o){
case 1:fin>>x;
n++;
k++;
addnod(k,x);
break;
case 2:fin>>p;
sterge(p);
break;
case 3:fout<<v[1].x<<endl;
}
}
return 0;
}