Pagini recente » Cod sursa (job #2150205) | Cod sursa (job #1602675) | Istoria paginii runda/bv_10 | Cod sursa (job #2789168) | Cod sursa (job #2548437)
#include <fstream>
using namespace std;
int h[200005],nr=0,poz[200005],cnt=0,ind[200005];
void up(int x)
{
if (x>1)
{
if (h[x]<h[x/2])
{
int p1=ind[x];
int p2=ind[x/2];
swap(h[x],h[x/2]);
swap(ind[x],ind[x/2]);
swap(poz[p1],poz[p2]);
up(x/2);
}
}
}
void down(int x)
{
if (x*2==nr)
{
if(h[x]>h[nr])
{
int p1=ind[x];
int p2=ind[nr];
swap(h[x],h[nr]);
swap(ind[x],ind[nr]);
swap(poz[p1],poz[p2]);
}
}
if (x<nr/2)
{
if (h[x]>h[x*2]||h[x]>h[x*2+1])
{
if (h[x*2]<h[x*2+1])
{
int p1=ind[x];
int p2=ind[x*2];
swap(h[x],h[x*2]);
swap(ind[x],ind[x*2]);
swap(poz[p1],poz[p2]);
down(x*2);
}
else
{
int p1=ind[x];
int p2=ind[x*2+1];
swap(h[x],h[x*2+1]);
swap(ind[x],ind[x*2+1]);
swap(poz[p1],poz[p2]);
down(x*2+1);
}
}
}
}
void add(int x)
{
nr++;
cnt++;
h[nr]=x;
ind[nr]=cnt;
poz[cnt]=nr;
up(nr);
}
void del(int x)
{
int p1=ind[poz[x]];
int p2=ind[nr];
swap(h[poz[x]],h[nr]);
swap(ind[poz[x]],ind[nr]);
swap(poz[p1],poz[p2]);
nr--;
up(poz[p2]);
down(poz[p2]);
}
int main()
{
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int n,t,x;
fin>>n;
for (int i=1;i<=n;i++)
{
fin>>t;
if (t==1)
{
fin>>x;
add(x);
}
if (t==2)
{
fin>>x;
del(x);
}
if (t==3)
fout<<h[1]<<"\n";
}
fin.close();
fout.close();
return 0;
}