Cod sursa(job #365302)

Utilizator robigiirimias robert robigi Data 18 noiembrie 2009 13:19:07
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>

using namespace std;

ifstream f ("heapuri.in");
ofstream g ("heapuri.out");

int n, v[200001], t, w[200001], vv[2000001];


void inserare (int m, int x, int nrr)
{   v[++m]=x;
    w[nrr]=m;
    vv[nrr]=m;
    int tata=m/2;
    int fiu=m;
    int ok=1;
    while (tata>0 && fiu>=1 && ok)
    {     if (v[tata]>v[fiu])
	  {
	     int aux=v[tata];
	     v[tata]=v[fiu];
	     v[fiu]=aux;

	     aux=w[tata];
	     w[tata]=w[nrr];
	     w[nrr]=aux;

	     aux=vv[tata];
	     vv[tata]=vv[fiu];
	     vv[fiu]=aux;

	     fiu=tata;
	     tata/=2;
	  }
	  else ok=0;
    }
    n=m;
}


void eliminare(int poz)
{   int tata=w[poz], cv=vv[n], cv2=w[poz];
    v[tata]=v[n--];
    v[n+1]=0;
    w[poz]=0;
    w[vv[n+1]]=cv2;
    vv[cv2]=cv;
    vv[n+1]=0;

    int fiu=tata*2;
    if (fiu<n)
    {  if (v[fiu]>v[fiu+1])
	  fiu++;
    }
    while (v[tata]>v[fiu] && fiu<=n)
    {     if (fiu<n)
	  {  if (v[fiu]>v[fiu+1])
	     fiu++;
	  }
	  if (v[tata]>v[fiu])
	  {
	     int aux=v[tata];
	     v[tata]=v[fiu];
	     v[fiu]=aux;

	     aux=vv[tata];
	     vv[tata]=vv[fiu];
	     vv[fiu]=aux;

	     aux=w[cv];
	     w[cv]=w[fiu];
	     w[fiu]=aux;

	     tata=fiu;
	     fiu*=2;
	  }
    }
}



void afis()
{    g << v[1] << "\n";
}


int main()
{   f >> t;

    int tip, nr, j=1;

    for (int i=1; i<=t; i++)
    {    f >> tip;
	     if (tip==1)
	     {   f >> nr;
	         inserare(n, nr, j++);
         }
         
         else

         if (tip==2)
         {   f >> nr;
	         eliminare(nr);
         }
         
         else

         if (tip==3)
         {
             afis();
         }
    }
    
    
    
    
    f.close();
    g.close();
    return 0;
}