Pagini recente » Cod sursa (job #1639272) | Cod sursa (job #522764) | Cod sursa (job #421713) | Cod sursa (job #2899654) | Cod sursa (job #333758)
Cod sursa(job #333758)
#include <fstream>
#define maxn 200000
using namespace std;
int N, dist[maxn+100],poz[maxn+100], heap[maxn+100], hind,cod,a,posix;
inline void swap(int i, int j)
{
int z;
z=heap[i];
heap[i]=heap[j];
heap[j]=z;
int t=poz[heap[i]];
poz[heap[i]]=poz[heap[j]];
poz[heap[j]]=t;
}
inline void upheap(int);
inline void add(int a) {
heap[++hind]=++posix;
poz[posix]=hind;
dist[posix]=a;
upheap(hind);
}
inline void downheap(int);
inline void dellete(int i) {
int r=poz[i];
swap(poz[i],poz[heap[hind]]);
//heap[poz[i]]=heap[hind];
//poz[heap[hind]]=poz[i];
poz[i]=-1;
heap[hind]=0;
hind--;
downheap(poz[heap[r]]);
}
inline void upheap(int i) {
while (i/2>0&&dist[heap[i]]<dist[heap[i/2]])
{
swap(i,i/2);
i/=2;
}
}
inline void downheap(int i) {
while ((2*i<=hind&&dist[heap[i]]>dist[heap[2*i]])||(2*i+1<=hind&&dist[heap[i]]>dist[heap[2*i+1]]))
{
if (2*i+1<hind&&dist[heap[2*i+1]]<dist[heap[2*i]])
{
swap(2*i+1,i);
i=2*i+1;
}
else
{
swap(2*i,i);
i=2*i;
}
}
}
int main() {
ifstream in;
ofstream out;
in.open("heapuri.in");
out.open("heapuri.out");
in >> N;
for (int i=0;i<N;i++) {
in >> cod;
if (cod<3) in >> a;
switch (cod) {
case 1:add(a);
break;
case 2:dellete(a);
break;
case 3: out << dist[heap[1]]<<"\n";
break;
}
}
out.close();
}