Pagini recente » Cod sursa (job #1715785) | Cod sursa (job #559291) | Cod sursa (job #856380) | Cod sursa (job #1460556) | Cod sursa (job #2940212)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int nod_val[250005];
int nrnod,nrins[250005],cateins;
vector<int>pushagain;
void insertvalue(int val)
{
nrnod++;
nod_val[nrnod]=val;//adaug pe ultima poz
int nodcurent=nrnod;
while(nodcurent>1 && nod_val[nodcurent/2]>nod_val[nodcurent])//parent>child
{
swap(nod_val[nodcurent/2],nod_val[nodcurent]);
nodcurent=nodcurent/2;
}
}
void popvalue(int val)
{
swap(nod_val[1],nod_val[nrnod]);
nrnod--;
int nodcurent=1;
int child1=-1;
int child2=-1;
if(nodcurent*2<=nrnod)
child1=nod_val[nodcurent*2];
if(nodcurent*2+1<=nrnod)
child2=nod_val[nodcurent*2+1];
int cmp=min(child1,child2);
while(cmp!=-1 && nod_val[nodcurent]>cmp)
{
if(child1<child2)
{
swap(nod_val[nodcurent],nod_val[nodcurent*2]);
nodcurent=nodcurent*2;
}
else
{
swap(nod_val[nodcurent],nod_val[nodcurent*2+1]);
nodcurent=nodcurent*2+1;
}
child1=-1;
child2=-1;
if(nodcurent*2<=nrnod)
child1=nod_val[nodcurent*2];
if(nodcurent*2+1<=nrnod)
child2=nod_val[nodcurent*2+1];
cmp=min(child1,child2);
}
}
int main()
{
int n;
in>>n;
for(int i=1;i<=n;i++)
{
int op;
in>>op;
if(op==1)
{
int val;
in>>val;
insertvalue(val);
nrins[++cateins]=val;
/*for(int j=1;j<=nrnod;j++)
out<<nod_val[j]<<' ';
out<<'\n';*/
}
pushagain.clear();
if(op==2)
{
int nrx;
in>>nrx;
int j=1;
while(j<=nrnod && nod_val[j]!=nrins[nrx])
{
pushagain.push_back(nod_val[j]);
j++;
}
for(int k=0;k<pushagain.size();k++)
popvalue(pushagain[k]);
popvalue(nrins[nrx]);
for(int k=0;k<pushagain.size();k++)
insertvalue(pushagain[k]);
}
if(op==3)
{
out<<nod_val[1]<<'\n';
}
}
return 0;
}