Pagini recente » Cod sursa (job #140060) | Cod sursa (job #2358838) | Cod sursa (job #1181122) | Cod sursa (job #2289474) | Cod sursa (job #637139)
Cod sursa(job #637139)
#include <cstdio>
using namespace std;
int v[200001],h[200001],poz[200001],nr,nh;
inline void swap(int a,int b)
{
int c;
c = h[a];
h[a] = h[b];
h[b] = c;
poz[h[a]] = a;
poz[h[b]] = b;
}
/*
void scrie_h()
{
for(int i=1 ; i<=nh ; i++)
printf("h[%d]=%d,v[%d]=%d\t",i,h[i],h[i],v[h[i]]);
printf("\n");
}
*/
void urca(int p)
{
while ((p != 1) && (v[h[p]] < v[h[p/2]]))
{
//poz[h[p]] = p/2;
//poz[h[p/2]] = p;
swap(p,p/2);
//swap(poz[h[p]],poz[h[p/2]]);
p=p/2;
}
}
void coboara(int p)
{
int ps=p;
if ((p*2 <= nh) && (v[h[2*p]] < v[h[ps]]))
ps = 2*p;
if ((p*2+1 <= nh) && (v[h[2*p+1]] < v[h[ps]]))
ps = 2*p+1;
if (ps != p)
{
//poz[h[p]] = ps;
//poz[h[ps]] = p;
swap(p,ps);
//swap(poz[h[p]],poz[h[ps]]);
coboara(ps);
}
}
int main()
{
int i,n,op,x,ord;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
for (i=1; i<=n; i++)
{
scanf("%d",&op);
//printf("nh = %d\t",nh);
if (op == 1)
{
scanf("%d",&x);
v[++nr]=x;
h[++nh]=nr;
poz[nr]=nh;
urca(nh);
//printf("am adaugat %d:\n",x);
//scrie_h();
}
if (op == 2)
{
scanf("%d",&ord);
h[poz[ord]] = h[nh];
poz[h[poz[ord]]] = ord;
swap(poz[ord],nh--);
urca(poz[ord]);
coboara(poz[ord]);
//printf("am scos al %d - lea elem = %d, aflat in h pe poz %d:\n",ord,v[ord],poz[ord]);
//scrie_h();
}
if (op == 3)
{
printf("%d\n",v[h[1]]);
}
}
return 0;
}