Pagini recente » Cod sursa (job #2817753) | Cod sursa (job #378711) | Cod sursa (job #2060115) | Cod sursa (job #2361500) | Cod sursa (job #396557)
Cod sursa(job #396557)
#include<fstream>
#define dmax 200004
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
long long n,x[dmax],h[dmax],l;
int left_son(int k)
{ return 2*k;
}
int right_son(int k)
{ return 2*k+1;
}
int father(int k)
{ return k/2;
}
void urca(int k)
{ int z,v;
v=h[k];
z=k;
while(h[father(z)]>v && z)
{ h[z]=h[father(z)];
z=father(z);
}
h[z]=v;
}
void coboara(int k,int d)
{ int z,t,f;
z=k;
do{ f=0;
if(left_son(z)<=d)
f=left_son(z);
else f=0;
if(right_son(z)<=d)
if(h[right_son(z)]<h[f])
f=right_son(z);
if(h[f]<h[z] && f)
{ t=h[z];
h[z]=h[f];
h[f]=t;
z=f;
}
}while(f);
}
void add(long long k)
{ l++;
h[l]=k;
urca(l);
}
void remove(long long k)
{ int i;
for(i=1;i<=l;i++)
if(h[i]==x[k])
{ h[i]=h[l];
l--;
coboara(i,l);
}
}
int main()
{ long long i,op,nr,j,crt=0;
in>>n;
for(i=1;i<=n;i++)
{ in>>op;
if(op!=3)
{ in>>nr;
if(op==1)
{ add(nr);
crt++;
x[crt]=nr;
}
if(op==2)
remove(nr);
}
else out<<h[1]<<'\n';
}
in.close();
return 0;
}