Cod sursa(job #822185)

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

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]);
		 ord[poz[nod/2]]=nod/2;
		   ord[poz[nod]]=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]); 
		   ord[poz[fiu2]]=fiu2;
		   ord[poz[fiu]]=fiu;
           downheap(fiu2);
           }
     else
     { swap(v[fiu],v[nod]);swap(poz[fiu],poz[nod]); ord[poz[fiu]]=fiu;
		   ord[poz[nod]]=nod; downheap(fiu);}
     
     }
 }


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


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

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;
}