Cod sursa(job #793913)

Utilizator ard_procesoareLupicu ard_procesoare Data 4 octombrie 2012 18:14:19
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[200005],vp=1,poz[200005],h[200005],lungime=0;
void coboara(int nr);
void urca(int n);
void sterge(int a);
void adauga(int a);
int main()
{
    int i,j,n;
    fin>>n;
    for(i=0;i<n;i++)
    {
        h[i]=i;
        poz[i]=i;
        fin>>j;
        if(j==1)
        {
            fin>>j;
            adauga(j);
            continue;
        }
        if(j==2)
        {
            fin>>j;
            sterge(h[j]);
        }
        if(j==3)
        {
            fout<<v[1]<<"\n";
        }
    }
    for(i=1;i<n;i++)
        cout<<v[i]<<" "<<h[i]<<"\n";
    return 0;
}
void coboara(int nr)
{
  int i= nr*2,c;
  while(i<=lungime)
  {
      if(v[i]>v[i+1]) i++;
      if(v[i]>v[nr]) break;
      h[poz[i]]=nr;
      h[poz[nr]]=i;
      c=v[i];v[i]=v[nr];v[nr]=c;
      c=poz[i];poz[i]=poz[nr];poz[nr]=c;
      nr=i;i=i*2;
  }
}
void urca(int a)
{
    int i=a/2,c;
    while(i>=1)
    {
        if(v[a]>v[i]) break;
        h[poz[a]]=i;
        h[poz[i]]=a;
        c=v[a];v[a]=v[i];v[i]=c;
        c=poz[a];poz[a]=poz[i];poz[i]=c;
        a=i;i=i/2;
    }

}
void sterge(int a){
    v[a]=v[lungime--];
    poz[a]=poz[lungime+1];
    h[poz[a]]=a;
    if(v[a]<v[a/2])
        urca(a);
    if(v[a]>v[a*2]||v[a]<v[a*2+1])
        coboara(a);
}
void adauga(int a)
{
    v[++lungime]=a;
    urca(lungime);
}