Pagini recente » Cod sursa (job #973762) | Cod sursa (job #468098) | Cod sursa (job #1319712) | Cod sursa (job #1114469) | Cod sursa (job #774094)
Cod sursa(job #774094)
#include <iostream>
#include <stdio.h>
#define nmax 200001
using namespace std;
int n,m,b[nmax],npoz;
struct nod{
int x;
int y;
} a[nmax];
void sw(int *a,int *b)
{
int t=*a; *a=*b; *b=t;
}
void swap(int poz,int nod)
{
sw(&a[poz].x,&a[nod].x);
sw(&a[poz].y,&a[nod].y);
b[a[poz].y]=poz;
b[a[nod].y]=nod;
}
void up(int nod)
{
if (nod==1) return;
int poz=nod/2;
if ( a[poz].x>a[nod].x )
{
swap(poz,nod);
up(poz);
}
}
void down(int nod)
{
if (nod>n) return;
int poz1=nod*2;
int poz2=nod*2+1;
if ( a[poz1].x<a[nod].x && poz1<=n)
{
swap(poz1,nod);
down(poz1);
}
if ( a[poz2].x<a[nod].x && poz2<=n )
{
swap(poz2,nod);
down(poz2);
}
}
void add(int val)
{
n++;
npoz++;
a[n].x=val;
a[n].y=npoz;
b[npoz]=npoz;
up(n);
}
void cut(int nod)
{
int t=b[nod];
if (b[nod]==n) n--;
else
{
swap(n,b[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",a[1].x);
break;
}
}
}
return 0;
}