Cod sursa(job #2183292)

Utilizator roberttrutaTruta Robert roberttruta Data 22 martie 2018 23:36:02
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
using namespace std;
struct heap
{
    int x,y;
}v[200002];
int poz[200002],m,OK,x,t,r,n,i;
void up(int a)
{
    while(v[a].x<v[a/2].x && a>=2)
    {
         m=v[a/2].x;
        v[a/2].x=v[a].x;
        v[a].x=m;
        m=v[a].y;///am interschimbat valorile dintre copil si parinte
        v[a].y=v[a/2].y;
        v[a/2].y=m;///am interschimbat pozitiile dintre copil si parinte
        poz[v[a/2].y]=a/2;
        poz[v[a].y]=a;///am reactualizat pe ce pozitie in heap se afla nr dupa schimbare
        a=a/2;
    }
}
void down(int a)
{
    while((v[a].x>v[2*a].x || v[a].x>v[2*a+1].x) && a<=n/2)
    {
       if(v[2*a].x>v[2*a+1].x)
        OK=1;
       m=v[2*a+OK].x;
        v[2*a+OK].x=v[a].x;
        v[a].x=m;
        m=v[a].y;
        v[a].y=v[2*a+OK].y;
        v[2*a+OK].y=m;
        poz[v[2*a+OK].y]=2*a+OK;
        poz[v[a].y]=a;
        a=2*a+OK;
        OK=0;
    }
}
void cut(int a)
{
    v[a].x=v[n].x;
    v[a].y=v[n].y;
    poz[v[a].y]=a;
    n--;///inlocuiesc nr ce trb eliminat cu ultimul nr din heap
    if(v[a].x<v[a/2].x)
        up(a);
    else
        if(v[a].x>v[2*a].x || v[a].x>v[2*a+1].x)
        down(a);
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");

  f>>t;int a=0;
  for(i=1;i<=t;i=i+1)
  {
      f>>x;
      if(x==1)
      {
          f>>a;
          v[++n].x=a;///pun noul nr in heap
          v[n].y=++r;///salvez si nr de ordine al numarului adaugat
          poz[r]=n;///al "r"-lea nr adugat se afla pe pozitia n in heap
          up(n);
      }
      if(x==2)
      {
          f>>a;
          cut(poz[a]);
      }
      if(x==3)
          g<<v[1].x<<'\n';
  }
    return 0;
}