Pagini recente » Cod sursa (job #51625) | Cod sursa (job #170010) | Cod sursa (job #268488) | Cod sursa (job #1570283) | Cod sursa (job #1452689)
#include <cstdio>
using namespace std;
int heap[200001],nr_noduri=0,poz_x[200001],x1=0,x_poz[200001];
void schimbare(int &a,int &b);
void operatia1(int heap1[],int &n)
{
int x;
scanf("%d ",&x);
x1++;
heap1[++n]=x;
poz_x[n]=x1;
x_poz[x1]=n;
int ok=1,k=n;
while (ok)
{
if (k/2 >= 1 && heap1[k] < heap1[k/2])
{
schimbare(heap1[k],heap1[k/2]);
schimbare(x_poz[x1],x_poz[poz_x[k/2]]);
schimbare(poz_x[k],poz_x[k/2]);
k/=2;
}
else ok=0;
}
}
void operatia2(int heap1[],int &n)
{
int x;
scanf("%d ",&x);
heap1[x_poz[x]]=1000000001;
int k=x_poz[x];
schimbare(heap1[k],heap1[n]);
schimbare(poz_x[n],poz_x[k]);
schimbare(x_poz[poz_x[k]],x_poz[x]);
n--;
int ok=1;
while (ok)
{
int min1=heap1[k],min2=k;
if (k*2+1<=n)
{
if (heap1[k*2 + 1] < heap1[k])
{
schimbare(heap1[k*2+1],heap1[k]);
schimbare(poz_x[k],poz_x[k*2+1]);
schimbare(x_poz[poz_x[k]],x_poz[poz_x[k*2+1]]);
k=k*2+1;
}
else
if (heap1[k*2] < heap1[k])
{
schimbare(heap1[k*2],heap1[k]);
schimbare(poz_x[k],poz_x[k*2]);
schimbare(x_poz[poz_x[k]],x_poz[poz_x[k*2]]);
k=k*2;
}
}
else
if (k*2<=n)
{
if (heap1[k*2] < heap1[k])
{
schimbare(heap1[k*2],heap1[k]);
schimbare(poz_x[k],poz_x[k*2]);
schimbare(x_poz[poz_x[k]],x_poz[poz_x[k*2]]);
k=k*2;
}
}
if (min2==k) ok=0;
}
}
void operatia3(int heap1[],int &n)
{
printf("%d\n",heap1[1]);
}
void schimbare(int &a,int &b)
{
int c=a;
a=b;
b=c;
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int n;
scanf("%d ",&n);
for (int i=1;i<=n;i++)
{
int a,b;
scanf("%d ",&a);
if (a==1)
operatia1(heap,nr_noduri);
if (a==2)
operatia2(heap,nr_noduri);
if (a==3)
operatia3(heap,nr_noduri);
}
}