Pagini recente » Cod sursa (job #1694697) | Stapanu tau | Cod sursa (job #1353441) | Cod sursa (job #1234278) | Cod sursa (job #389996)
Cod sursa(job #389996)
#include<fstream>
#include<iostream>
using namespace std;
#define nr 200000
int n,m,h[nr],v[nr],poz[nr];
void adauga(int x)
{
v[++n]=x;//il adaug pe x in vector
h[++m]=n;//pe n il adaug in heap
poz[n]=m;//tin minte pozitia lui m
int pp=0,i=m;//presupun ca nu e heap
for(;!pp&&i>1;)//daca pp==0 si i>1
if(v[h[i/2]]<v[h[i]])//daca parintele e mai mic atunci e heap
pp=1;
else//daca nu atunci trebuie interschimbate valorile
{
int aux=h[i];//interschimb valorile
h[i]=h[i/2];
h[i/2]=aux;
poz[h[i]]=i;//actualizez pozitiile
poz[h[i/2]]=i/2;
i/=2;//trec mai departe
}
}
void sterge(int x)
{
int i=poz[x],k;//la i ii dau pozitia lui x
int pp=0;//presupun ca nu e heap
h[i]=h[m--];
poz[h[i]]=i;//nu imi merge forul
for(;!pp&&i*2<=m;)//daca pp==0 si i*2<n
{
k=2*i;
if(k+1<=m&&v[h[k]]>v[h[k+1]])//dintre cei doi fii ai lui i il aleg pe cel mai mic
++k;
if(v[h[i]]<v[h[k]])//daca parintele e mai mic atunci e heap
pp=1;
else//daca nu e heap interschimb valorile
{
int aux=h[i];
h[i]=h[k];
h[k]=aux;
poz[h[i]]=i;
poz[h[k]]=k;
i=k;//trec mai departe
}
}
for(int i=1;i<=m;i++)
cout<<h[i]<<" ";
cout<<endl;
}
int main()
{
int z,op,x;
ifstream fin("heapuri.in");
fin>>z;
FILE *fout=fopen("heapuri.out","w");
for(;z;--z)
{
fin>>op;
if(op==3)fprintf(fout,"%d\n",v[h[1]]);
else
{
fin>>x;
if(op==1)adauga(x);
else sterge(x);
}
}
fclose(fout);
system("pause");
return 0;
}