Pagini recente » Cod sursa (job #724877) | Cod sursa (job #2562851) | Cod sursa (job #2103983) | Cod sursa (job #721277) | Cod sursa (job #950334)
Cod sursa(job #950334)
#include <fstream>
using namespace std;
struct nod
{
int val;
int ind;
};
nod heap[200005];
int frec[200005];
int lung;
inline int tata(int x)
{
return (x/2);
}
inline int fiu_s(int x)
{
return (x<<1);
}
inline int fiu_d(int x)
{
return (x<<1+1);
}
void schimba(int x,int y)
{
nod aux;
aux=heap[x];
heap[x]=heap[y];
heap[y]=aux;
int aux2;
aux2=frec[heap[y].ind];
frec[heap[y].ind]=frec[heap[x].ind];
frec[heap[x].ind]=aux2;
}
void urca(int poz)
{
while(poz!=1)
if(heap[poz].val<heap[tata(poz)].val)
{
schimba(poz,tata(poz));
poz=tata(poz);
}
else
break;
}
#define inf 1000000005
void coboara(int poz)
{
int indice=-1;
int valoare=inf;
while(1)
{
indice=-1;
valoare=inf;
if(heap[fiu_s(poz)].val<heap[poz].val && fiu_s(poz)<=lung && heap[fiu_s(poz)].val<valoare)
{
valoare=heap[fiu_s(poz)].val;
indice=fiu_s(poz);
}
if(heap[fiu_d(poz)].val<heap[poz].val && fiu_d(poz)<=lung && heap[fiu_d(poz)].val<valoare)
{
valoare=heap[fiu_d(poz)].val;
indice=fiu_d(poz);
}
if(indice>-1)
{
schimba(poz,indice);
poz=indice;
}
else
break;
}
}
int cron;
void insert(int x)
{
heap[++lung].val=x;
heap[lung].ind=cron;
frec[cron++]=lung;
urca(lung);
}
void del(int x)
{
int poz=frec[x];
//cout<<endl<<"Valoare de coborare este "<<poz<<endl;
schimba(poz,lung);
frec[heap[lung].ind]=0;
heap[lung].val=0;
heap[lung].ind=0;
lung--;
coboara(poz);
}
int min()
{
return heap[1].val;
}
/*
void afis()
{
cout<<endl<<"Heapul este: "<<endl;
int i;
for(i=1;i<=lung;i++)
{
cout<<heap[i].val<<' ';
}
cout<<'\n';
for(i=1;i<=lung;i++)
{
cout<<heap[i].ind<<' ';
}
cout<<'\n';
}*/
int main()
{
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
int n,i,cod,val;
lung=0;
cron=1;
cin>>n;
for(i=0;i<n;i++)
{
cin>>cod;
if(cod==3)
{
cout<<min()<<'\n';
continue;
}
cin>>val;
if(cod==1)
insert(val);
else
del(val);
//afis();
}
cin.close();
cout.close();
//system("PAUSE");
return 0;
}