Pagini recente » Cod sursa (job #2369557) | Cod sursa (job #578203) | Cod sursa (job #2804284) | Cod sursa (job #2586383) | Cod sursa (job #523775)
Cod sursa(job #523775)
#include<stdio.h>
#define dim 200005
using namespace std;
int i,n,cod,x,v[dim],k,poz[dim],a,ult,hpoz[dim];
void swap(int &a, int &b)
{int c;
c=a; a=b; b=c;
}
void insert()
{int i;
k++; poz[k]=k; hpoz[k]=k;
if(!v[1]) {v[1]=x; poz[1]=1;}
else
{v[k]=x; i=k;
if(v[k/2]>v[k])
while(1)
{swap(v[i],v[i/2]); swap(hpoz[i], hpoz[i/2]); poz[k]=i/2; poz[i/2]=i; i=i/2;
if(v[i/2]<v[i]) break;
}
}
}
void sterg()
{int i;
ult=poz[x]; //pozitia ultimului in heap
v[ult]=v[k]; hpoz[ult]=hpoz[k]; v[k]=0; hpoz[k]=0;
poz[hpoz[ult]]=hpoz[ult];
//hpoz[ult]=hpoz[k];
poz[x]=0; hpoz[k]=0; i=ult; k--;
if(v[i]<v[i/2])
while(1)
{swap(v[i],v[i/2]); swap(hpoz[i], hpoz[i/2]); poz[k]=i/2; poz[i/2]=i; i=i/2;
if(v[i/2]<v[i]) break;
}
if( (v[i]>v[i*2] || v[i]>v[i*2+1]) && (i*2<=k) )
while(1 && i<=k)
{swap(v[i],v[i*2]); swap(hpoz[i], hpoz[i*2]); poz[k]=i*2; poz[i*2]=i; i=i*2;
if(v[i]>v[i*2] || v[i]>v[i*2+1]) break;}
}
int main()
{
FILE *f=fopen("heapuri.in","r"), *g=fopen("heapuri.out","w");
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
{fscanf(f,"%d",&cod);
if(cod==1) {fscanf(f,"%d",&x); insert();}
else if(cod==2) {fscanf(f,"%d",&x); sterg();}
else fprintf(g,"%d\n",v[1]);
}
fclose(f);
fclose(g);
return 0;
}