Cod sursa(job #822155)

Utilizator alinaelenaFMI Colceag Alina alinaelena Data 22 noiembrie 2012 22:41:01
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
using namespace std;
int v[200001],u,poz[200001],num;

void swap (int &a,int &b)
{
     int aux;
     aux=a;
     a=b;
     b=aux;
 }

void upheap (int nod)
{
     if (nod>1) 
     if (v[nod/2]>v[nod])
        {swap(v[nod/2],v[nod]);
         swap(poz[nod/2],poz[nod]);
        upheap(nod/2);
                }
 }

void downheap( int nod)
{
     int fiu,fiu2;
     if (nod*2<=u)
    { fiu=nod*2;
     fiu2=nod*2+1;
     if (nod*2+1<=u && v[fiu]>v[fiu2]){

           swap(v[fiu2],v[nod]);
           swap(poz[fiu2],poz[nod]); 
           downheap(fiu2);
           }
     else
     { swap(v[fiu],v[nod]);swap(poz[fiu],poz[nod]); downheap(fiu);}
     
	}
 }


void inserare(int x)
{
     int i;
     if (u==0){ v[++u]=x; poz[u]=u;}
     else
     { v[++u]=x;poz[u]=u;
       upheap(u);     
         }
      }


int caut(int x)
{
	int i;
	for (i=1;i<=u;++i)
		if (poz[i]==x)
			return i;
}

void stergere(int x)
{
	int poz2;
	poz2=caut(x);
     v[poz2]=v[u];
     u--;
     downheap(poz2);
          
 }

void afisare()
{
     printf("%d\n",v[1]);
}


int main()
{
  freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int n,i,op,x;
    scanf("%d",&n);
    for (i=1;i<=n;++i)
    {
        scanf("%d",&op);
		if ((op==1)||(op==2))scanf("%d",&x);
        if (op==1)
        { inserare(x);}
        if (op==2)
       stergere(x);
        if (op==3)
        afisare();
	}
    return 0;
}