Cod sursa(job #2496912)

Utilizator eusebiu_alexandruMorar Eusebiu eusebiu_alexandru Data 21 noiembrie 2019 20:29:41
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
#define nmax 300000

using namespace std;
ifstream f ("heapuri.in");
ofstream g ("heapuri.out");
int heap[nmax],ordine[999999999],poz[nmax],cronologic[nmax],operati,Cerinta,x,n,n1;
void sift(int k,int n)
{
   int sonleft=0,sonright=0,ales=0;
do
{
   if(k*2<=n)
     sonleft=k*2,ales=k*2;
   if(k*2+1<=n)
   {
      sonright=k*2+1;
   if(heap[sonleft]<heap[sonright])
         ales=k*2;
   else
      ales=k*2+1;
   }
   if(heap[ales]>heap[k])
       ales=0;
   if(ales)
   {
       swap(heap[ales],heap[k]);
       swap(ordine[heap[ales]],ordine[heap[k]]);
   }
}while(ales);
}
void percolaite(int k,int n)
{
    int tata=k/2;
    while(k>1 && heap[k]<heap[tata])
    {
        swap(heap[k],heap[tata]);
        swap(ordine[heap[k]],ordine[heap[tata]]);
        k=tata;
        tata=k/2;
    }
}
int main()
{
  f>>operati;
  while(operati)
  {
      operati--;
      f>>Cerinta;
      if(Cerinta==1)
      {
        f>>x;
        cronologic[++n1]=x;// valoarea x a fost citita in al n1 rand
        n++;
        ordine[x]=n;/// in ce nod se afla valoarea x
        heap[n]=x; /// ce valoare se afla in nodul n
        percolaite(ordine[x],n);
      }
      if(Cerinta==2)
      {
         f>>x;
         heap[ordine[cronologic[x]]]=heap[n];
         ordine[heap[n]]=ordine[cronologic[x]];
         n--;
         sift(ordine[cronologic[x]],n);
      }
      if(Cerinta==3)
         g<<heap[1]<<endl;
  }
}