Cod sursa(job #1539445)

Utilizator codi22FMI Condrea Florin codi22 Data 30 noiembrie 2015 19:55:46
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.84 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out("heapuri.out");
int n, q=0, x, lh=0;
int poz_heap[200002],poz_vec[200002];

typedef int Heap[200002];
Heap H;

int tata(int xx)
{return xx/2;}

int fiu_stg(int xx)
{return xx*2;}

 int fiu_dr(int xx)
{return xx*2+1;}


void Interschimba(int a, int b)
{
    int s=poz_vec[a];
    int t=poz_vec[b];
    int aux;
    aux=H[b];
    H[b]=H[a];
    H[a]=aux;
    poz_vec[b] = s;
    poz_heap[s] = b;
    poz_vec[a] = t;
    poz_heap[t] = a;
}

void coboara(int k)
{
    int fiu, ok=1;
    while(fiu_stg(k)<=lh && ok)
    {
        fiu=fiu_stg(k);
        if(fiu_dr(k)<=lh && H[fiu_dr(k)]<H[fiu_stg(k)])
            fiu=fiu_dr(k);
        if(H[k]>H[fiu])
        {
            Interschimba(k,fiu);
            k=fiu;
        }
        else
            ok=0;
    }
}


void urca(int k)
{
     while (k>1 && H[k]<H[tata(k)])
        {
            Interschimba(k,tata(k));
            k=tata(k);
        }
}


void elimina(Heap H, int k)
{
    Interschimba(k,lh);
    lh--;
    if (k>1 && H[k]<H[tata(k)])
        urca(k);
    else
        coboara(k);
}


void insereaza(int e)
{
    lh++;
    H[lh]=e;
    poz_heap[q]=lh;
    poz_vec[lh]=q;
    urca(lh);
}

int main()
{
    in>>n;
    int i, l=0,cerinta;
    for(i=0; i<n; i++)
    {
        in>>cerinta;
        if(cerinta==1)
            {
                in>>x;
                q++;
                insereaza(x);

            }
        else
            if(cerinta==2)
                {
                    in>>x;
                    elimina(H,poz_heap[x]);
                }
            else
                if(cerinta==3)
                    out<<H[1]<<'\n';

    }
    in.close();
    out.close();


    return 0;
}
/*#include <iostream>
#include <cstdio>
#define lli long long int
#define mx 200000
using namespace std;
lli n,i,V[mx],p1[mx],p2[mx],z,c;
void interschimbare(lli a,lli b)
{
    int s=p1[a];
    int t=p1[b];
    int aux;
    aux=V[a];
    V[a]=V[b];
    V[b]=aux;
    p1[b]=s;
    p2[s]=b;
    p1[a]=t;
    p2[t]=a;
}
void urca()
{

    lli j=i,aux;
    while (V[j/2]>V[j]&&j>1)
    {
       /* p2[j]=p2[j/2];
        p1[p2[j/2]]=j;
        p1[i]=j/2;
        p2[j/2]=i;
        aux=V[j/2];
        V[j/2]=V[j];
        V[j]=aux;*//*
        interschimbare(j/2,j);
        j>>=1;
    }
}
void coboara(lli x)
{
    lli j=x,aux;
    while (V[j*2]<V[j]||V[j*2+1]<V[j])
    {
        if (V[j*2]<V[j*2+1])
        {
      /*  p2[j]=p2[j*2];
        p1[p2[j*2]]=j;
        p1[a]=j*2;
        p2[j*2]=a;
        aux=V[j*2];
        V[j*2]=V[j];
        V[j]=aux;*/
      //  interschimbare(j,j*2);
     //   j<<=1;
     //   }
     //   else
     //   {
      /*  p2[j]=p2[j*2+1];
        p1[p2[j*2+1]]=j;
        p1[a]=j*2+1;
        p2[j*2+1]=a;
        aux=V[j*2+1];
        V[j*2+1]=V[j];
        V[j]=aux;*/
////        interschimbare(j,j*2+1);
    //    j<<=1;
    //    j++;
    //    }
  //  }
//}/*
/*
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%lli",&n);
    int q,k=0;
    for (q=1;q<=n;q++)
    {
        scanf("%lli",&z);
        if (z==1)
        {
            i++;
            k++;
            scanf("%lli",&c);
            V[i]=c;
            p1[k]=i;
            p2[i]=c;
            urca();
        }
        if (z==2)
        {
            scanf("%lli",&c);
            cout<<p1[c]<<" "<<i<<" "<<p1[c]<<"a \n";
            interschimbare(p1[c],i);

            coboara(p1[i]);

            i--;
            V[i]=100000;
        }
        if (z==3)
        {
            cout<<V[1]<<'\n';
        }
    }
  //  int j;
  //  for (j=1;j<=i;j++)
  //      cout<<V[j]<<" ";
}*/