Cod sursa(job #793887)

Utilizator ard_procesoareLupicu ard_procesoare Data 4 octombrie 2012 16:50:53
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("Heapuri.in");
ofstream fout("Heapuri.out");
int v[200000],poz=1,vp[200000],lungime=0;
int coboara(int nr);
int urca(int n);
void build();
void stergepoz(int a);
void schimba(int &a,int &b);
void sterge(int a);
void adauga(int a);
int main()
{
    int i,j,n;
    fin>>n;
    for(i=0;i<n;i++)
    {
        fin>>j;
        if(j==1)
        {
            fin>>j;
            vp[poz++] = j;
            adauga(j);
            continue;
        }
        if(j==2)
        {
            fin>>j;
            stergepoz(j);
        }
        if(j==3)
        {
            fout<<v[1]<<endl;
        }
    }
    build();
    sterge(2);
    adauga(100);adauga(88);
    return 0;
}
int coboara(int nr)
{
  int i= nr*2;
  while(i<=lungime)
  {
      if(v[i]>v[i+1]) i++;
      if(v[i]>v[nr]) return 0;
      schimba(v[i],v[nr]);
      nr=i;i=i*2;
  }
}
int urca(int a)
{
    int i=a/2;
    while(i>=1)
    {
        if(v[a]>v[i]) return 0;
        schimba(v[a],v[i]);
        a=i;i=i/2;
    }

}
void schimba(int &a,int &b)
{
    int c;
    c=a;a=b;b=c;
}
void build()
{
    int i;
    for(i=lungime/2;i>0;i--)
    {
        coboara(i);
    }
}
void sterge(int a){
    v[a]=v[lungime--];
    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);
}
void stergepoz(int a)
{
    for(int i=0;i<lungime;i++)
    {
        if(vp[a]==v[i])
        {
            sterge(i);
            break;
        }
    }
}