Pagini recente » Cod sursa (job #1826525) | Cod sursa (job #1552273) | Cod sursa (job #2333852) | Cod sursa (job #239429) | Cod sursa (job #2295094)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int v[200003],n,tip,nr,lv,poz[200003];///in poz[pozitia in v] am 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[k],poz[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[k],poz[st(k)]);
swap(v[k],v[st(k)]);
k=st(k);
}
else if(dr(k))
{
swap(poz[k],poz[dr(k)]);
swap(v[k],v[dr(k)]);
k=dr(k);
}
}
}
int main()
{
f>>n;
for(int i=1;i<=n;i++)
{
f>>tip;
if(tip==1)
{
f>>nr;
lv++;
poz[lv]=i;
v[lv]=nr;
up(lv);
}
else if(tip==2)
{
f>>nr;
if(nr==lv)lv--;
else
{
lv--;
v[nr]=v[lv+1];
poz[nr]=poz[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';
}
}