Pagini recente » Cod sursa (job #3264725) | Cod sursa (job #2366480) | Cod sursa (job #2748002) | Cod sursa (job #2040621) | Cod sursa (job #2295126)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int v[200003],n,tip,nr,lv,poz[200003],intrat=0;///in poz[al catelea elem a intrat]=pozitia in heap
int poz2[200003];///in poz2[pozitia in heap]=poz[al catelea elem a intrat]
int tata(int k)
{
return (k/2);
}
int st(int k)
{
int x=k*2;
if(x<=lv)
return x;
else return 0;
}
int dr(int k)
{
int x=k*2+1;
if(x<=lv)
return x;
else return 0;
}
void up(int k)
{
while(k>1 && v[k]<v[tata(k)])
{
swap(poz[poz2[k]],poz[poz2[tata(k)]]);
swap(poz2[k],poz2[tata(k)]);
swap(v[k],v[tata(k)]);
k=tata(k);
}
}
void down(int k)
{
while(v[k]>v[st(k)] || v[k]>v[dr(k)])
{
if(v[st(k)]<v[dr(k)] && st(k))
{
swap(poz[poz2[k]],poz[poz2[st(k)]]);
swap(poz2[k],poz2[st(k)]);
swap(v[k],v[st(k)]);
k=st(k);
}
else if(dr(k))
{
swap(poz[poz2[k]],poz[poz2[dr(k)]]);
swap(poz2[k],poz2[dr(k)]);
swap(v[k],v[dr(k)]);
k=dr(k);
}
}
}
int main()
{
//cout<<(sizeof(poz)/1024.0)/1024.0;
f>>n;
for(int i=1;i<=n;i++)
{
f>>tip;
if(tip==1)
{
intrat++;
f>>nr;
lv++;
poz[intrat]=lv;
poz2[lv]=intrat;
v[lv]=nr;
up(lv);
}
else if(tip==2)
{
f>>nr;
if(nr==lv)lv--;
else
{
nr=poz[nr];
lv--;
v[nr]=v[lv+1];
poz[nr]=poz[lv+1];
poz2[nr]=poz2[lv+1];
if(v[nr]<v[tata(nr)] && tata(nr))
up(nr);
else if((v[nr]>v[st(nr)] && st(nr)) || (v[nr]>v[dr(nr)] && dr(nr)))
down(nr);
}
}
else g<<v[1]<<'\n';
}
}