Pagini recente » Cod sursa (job #560276) | Cod sursa (job #911299) | Cod sursa (job #1966996) | Cod sursa (job #604125) | Cod sursa (job #696276)
Cod sursa(job #696276)
#include <fstream>
using namespace std;
int val[200010],h[200010],n,m,nr;
int maxx(int a,int b)
{
if(val[a]>val[b])
return a;
return b;
}
void sift(int i)
{
if(val[h[i]]>val[h[i*2]]&&h[i*2])
{
if(val[h[i]]>val[h[i*2+1]]&&h[i*2+1])
{
int s=maxx(h[i*2],h[i*2+1]);
swap(h[i],h[s]);
sift(s);
}
else
{
swap(h[i],h[i*2]);
sift(i*2);
}
}
else
{
if(val[h[i]]>val[h[i*2+1]]&&h[i*2+1])
{
swap(h[i],h[i*2+1]);
sift(i*2+1);
}
}
return;
}
void percolate(int i)
{
if(val[h[i]]<val[h[i/2]])
{
swap(h[i],h[i/2]);
percolate(i/2);
}
}
int search(int i,int x)
{
if(!h[i])
return 0;
if(h[i]==x)
return i;
else
{
if(val[h[i*2]]<=val[x]&&val[h[i*2+1]]<val[x])
return search(i*2,x);
if(val[h[i*2+1]]<=val[x]&&val[h[i*2]]<val[x])
return search(i*2+1,x);
return maxx(search(i*2+1,x),search(i*2,x));
}
}
void insert(int x)
{
val[++nr]=x;
h[++m]=nr;
if(val[h[m/2]]>val[h[m]])
{
swap(h[m/2],h[m]);
percolate(m/2);
}
}
void delet(int x)
{
int i=search(1,x);
h[i]=h[m];h[m--]=0;
if(val[h[i]]<val[h[i/2]])
percolate(i);
else
sift(i);
}
int main()
{
ifstream f("heapuri.in");
f>>n;
int o;
ofstream g("heapuri.out");
for(int i=0;i<n;i++)
{
f>>o;int x;
switch(o)
{
case 1: f>>x; insert(x);break;
case 2: f>>x; delet(x);break;
case 3: g<<val[h[1]]<<'\n';
}
}
return 0;
}