Pagini recente » Cod sursa (job #2323038) | Istoria paginii runda/aicluj_08-11/clasament | Cod sursa (job #2981869) | Cod sursa (job #2079584) | Cod sursa (job #774339)
Cod sursa(job #774339)
#include <iostream>
#include <stdio.h>
#define nmax 200001
using namespace std;
int n,m,Poz[nmax],npoz;
struct nod{
int x;
int y;
} H[nmax];
void sw(nod *a,nod *b)
{
nod t=*a; *a=*b; *b=t;
}
void up(int nod)
{
int poz,t=1;
while ( t )
{
t=0;
poz = nod/2;
if (poz>=1 && H[poz].x>H[nod].x )
{
sw(&H[poz],&H[nod]);
Poz[H[poz].y]=poz;
Poz[H[nod].y]=nod;
t=1;
}
nod=nod/2;
}
}
void down(int nod)
{
if (nod>n) return;
int poz1=nod*2;
int poz2=nod*2+1;
if ( H[poz1].x<H[nod].x && poz1<=n)
{
sw(&H[poz1],&H[nod]);
Poz[H[poz1].y]=poz1;
Poz[H[nod].y]=nod;
down(poz1);
}
if ( H[poz2].x<H[nod].x && poz2<=n )
{
sw(&H[poz2],&H[nod]);
Poz[H[poz2].y]=poz2;
Poz[H[nod].y]=nod;
down(poz2);
}
}
void add(int val)
{
n++;
npoz++;
H[n].x=val;
H[n].y=npoz;
Poz[npoz]=npoz;
up(n);
}
void cut(int nod)
{
int t=Poz[nod];
if (t==n) n--;
else
{
sw(&H[n],&H[Poz[nod]]);
n--;
up(t);
down(t);
}
}
int main()
{
int i,k,p,j;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%i",&m);
n=0;npoz=0;
for (i=1; i<=m; i++)
{
scanf("%i",&k);
switch(k)
{
case 1:{
scanf("%i",&p);
add(p);
break;
}
case 2:{
scanf("%i",&p);
cut(p);
break;
}
default: {
printf("%i\n",H[1].x);
break;
}
}
}
return 0;
}