Pagini recente » Cod sursa (job #135776) | Cod sursa (job #53213) | Cod sursa (job #2695073) | Cod sursa (job #3283305) | Cod sursa (job #563470)
Cod sursa(job #563470)
#include<stdio.h>
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
int n,z,x,i,son,l,poz[200001],t[200001],v[200001];
void insert(int k){
int key=k;
++v[0];
int j=v[0];
while(v[j/2]>k&&j>1){
v[j]=v[j/2];
poz[j]=poz[j/2];
j=j/2;
t[poz[j]]=j;
}
v[j]=key;
poz[j]=++l;
t[l]=j;
}
void down(int k){
v[k]=v[v[0]];
poz[k]=poz[v[0]];
v[0]--;
int j=k;
if(v[j/2]>v[j]){
int key=v[j];
while(v[j/2]>v[j]&&j>1){
v[j]=v[j/2];
poz[j]=poz[j/2];
j/=2;
t[poz[j]]=j;
}
v[j]=key;
poz[j]=poz[k];
t[poz[j]]=j;
}
else {
int ok=1;
while(ok){
son=0;
if(2*j<=v[0])
if(v[2*j]<v[j])
son=2*j;
if(2*j+1<=v[0])
if(v[2*j+1]<v[j]&&v[2*j+1]<v[2*j])
son=2*j+1;
if(son){
v[j]=v[son];
poz[j]=poz[son];
t[poz[j]]=j;
j=son;
}else
ok=0;
}
v[j]=v[k];
poz[j]=poz[k];
t[poz[j]]=j;
}
}
int main() {
fscanf(f,"%d",&n);
for(i=1;i<=n;++i){
fscanf(f,"%d",&z);
if(z==1){
fscanf(f,"%d",&x);
insert(x);
}else if(z==2){
fscanf(f,"%d",&x);
down(t[x]);
}else
fprintf(g,"%d\n",v[1]);
}
fclose(g);
fclose(f);
return 0;
}