Cod sursa(job #2952951)

Utilizator Emmy432622Rotariu Emanuel Emmy432622 Data 10 decembrie 2022 11:27:34
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <bits/stdc++.h>
#define nmax 200005
using namespace std;

ifstream fin ("heapuri.in");
ofstream fout("heapuri.out");

int H[nmax],n;
int sz;
map<int,int>p;
vector<int> ord;

void combinare(int H[], int n, int i); //combin heapurile corecte cu radacinile 2i si 2i+1 cu nodul i
void creare_comb(int H[], int& n);
int extrag_min(int H[], int& n);
void stergere(int H[], int& n, int poz);
void inserare(int H[], int& n, int x);

void creare(int H[], int& n)
{
  int x;
  fin >> n;
  for(int i=0 ; i<n ; )
  {
    fin >> x;
    inserare(H,i,x);
  }
}

void afisare(int H[], int n)
{
  for(int i = 0 ; i < n ; ++i)
    fout << H[i] << ' ';
}

int main()
{
    int m;
    fin >> m;

    int t,x;
    for(int i = 1 ; i <= m ; ++i)
    {
      fin >> t;
      if(t==3)
      {
        fout<<H[1]<<'\n';
        continue;
      }

      fin >> x;

      if(t==1)
      {
        inserare(H,sz,x);
        ord.push_back(x);
      }
      else
        stergere(H,sz,p[ord[x-1]]);
    }

    return 0;
}

void inserare(int H[], int& n, int x)
{
  int poz = n+1, tpoz=poz/2;

  while(H[tpoz] > x && tpoz)
  {
    H[poz] = H[tpoz];
    p[H[tpoz]] = poz;

    poz = tpoz;
    tpoz = poz/2;
  }
  H[poz]=x;
  p[x] = poz;
  n++;
}

void combinare(int H[], int n, int i)
{
  int x = H[i], tata=i, fiu=2*i;

  while(fiu <= n)
  {
    if(fiu+1 <= n && H[fiu+1] < H[fiu]) fiu++;

    if(H[fiu]<x)
    {
      H[tata] = H[fiu];
      p[H[fiu]] = tata;

      tata = fiu;
      fiu = 2*tata;
    }
    else break;
  }

  H[tata]=x;
  p[x] = tata;
}

void stergere(int H[], int& n, int poz)
{
  H[poz] = H[n--];
  p[H[n]] = poz;
  combinare(H,n,poz);
}



int extrag_min(int H[], int& n)
{
  int ans = H[1];

  H[1] = H[n--];
  combinare(H,n,1);

  return ans;
}
void creare_comb(int H[], int&n)
{
  fin >> n;
  for(int i = 1 ; i <= n ; ++i) fin >> H[i];
  for(int i = n/2 ; i > 0 ; --i)combinare(H,n,i);
}