Pagini recente » Cod sursa (job #3280607) | Cod sursa (job #2643671) | Cod sursa (job #160462) | Cod sursa (job #1390886) | Cod sursa (job #613227)
Cod sursa(job #613227)
#include<stdio.h>
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
int n,z,x,i,son,l;
int poz[200001],w[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];
w[poz[j]]=j;
j=j/2;
}
v[j]=key;
poz[j]=l++;
w[l]=j;
}
void down(int k){
v[k]=v[v[0]];
poz[k]=poz[v[0]];
w[poz[k]]=k;
v[0]--;
int j=k;
if(v[j/2]>v[j]){
int key=v[j];
int key1=poz[k];
while(v[j/2]>key&&j>1){
v[j]=v[j/2];
poz[j]=poz[j/2];
w[poz[j]]=j;
j/=2;
}
v[j]=key;
poz[j]=key1;
w[poz[j]]=j;
}
else {
int ok=1;
int key=v[k];
int key1=poz[k];
while(ok){
son=0;
if(2*j<=v[0])
if(v[2*j]<key)
son=2*j;
if(2*j+1<=v[0])
if(v[2*j+1]<key&&v[2*j+1]<v[2*j])
son=2*j+1;
if(son){
v[j]=v[son];
poz[j]=poz[son];
w[poz[j]]=j;
j=son;
}else
ok=0;
}
v[j]=key;
poz[j]=key1;
w[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(w[x]);
}
else
fprintf(g,"%d\n",v[1]);
}
fclose(f);
fclose(g);
return 0;
}