Pagini recente » Cod sursa (job #44565) | Cod sursa (job #948934) | Cod sursa (job #2898013) | Cod sursa (job #2309278) | Cod sursa (job #2954458)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
int n,a;
class heap{
private:
int hipi[200001],cron[200001],n,inv[200001],ord=0;
public:
void operator+=(int &a)
{
int p=n,p2=(p-1)/2;
hipi[n++]=a;
while(p!=0&&hipi[p2]>a)
{
hipi[p]=hipi[p2];
cron[p]=cron[p2];
inv[cron[p2]]=p;
p=p2;
p2=(p-1)/2;
}
hipi[p]=a;
cron[p]=++ord;
inv[ord]=p;
}
void operator--(int a=0)
{
int p=0;
int x=hipi[--n],y=cron[n];
while(p<n/2)
{
int p1=p*2+1,p2=p*2+2;
if(p1>=n)
break;
if(p2>=n)
p1=p1;
if(hipi[p1]>hipi[p2])
swap(p1,p2);
if(hipi[p1]<x)
{
hipi[p]=hipi[p1];
cron[p]=cron[p1];
inv[cron[p1]]=p;
p=p1;
}
else if(hipi[p2]<x)
{
hipi[p]=hipi[p2];
cron[p]=cron[p2];
inv[cron[p2]]=p;
p=p2;
}
else
break;
}
hipi[p]=x;
cron[p]=y;
inv[cron[p]]=p;
}
void afis(ostream &output)
{
output<<hipi[0]<<'\n';
}
void operator-=(int &a)
{
if(a<=ord)
{
int p=inv[a];
int x=hipi[--n],y=cron[n],z=inv[y];
while(p<n/2)
{
int p1=p*2+1,p2=p*2+2;
if(p1>=n)
break;
if(p2>=n)
p1=p1;
if(hipi[p1]>hipi[p2])
swap(p1,p2);
if(hipi[p1]<x)
{
hipi[p]=hipi[p1];
cron[p]=cron[p1];
inv[cron[p1]]=p;
p=p1;
}
else if(hipi[p2]<x)
{
hipi[p]=hipi[p2];
cron[p]=cron[p2];
inv[cron[p2]]=p;
p=p2;
}
else
break;
}
hipi[p]=x;
cron[p]=y;
inv[cron[p]]=p;
}
}
friend ostream& operator<<(ostream& output,heap &a)
{
while(a.n)
{
output<<a.hipi[0]<<' ';
a--;
}
return output;
}
};
heap v,c;
int t,cc;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t;
if(t<=2)
{
cin>>a;
if(t==1)
{
v+=a;
}
else
{
v-=a;
}
}
else
{
v.afis(cout);
}
}
return 0;
}