Cod sursa(job #2191694)

Utilizator iulius510iulius alexandru iulius510 Data 3 aprilie 2018 14:25:56
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int N,k,l,C[1000001];
vector <int> v,nr;
void ad_heap(int x)
{
    v.push_back(x);
    k=v.size()-1;
    l=l+1;
    nr.push_back(l);
    C[nr[nr.size()-1]]=nr.size()-1;
    while(k/2>0&&v[k]<v[k/2])
    {
        swap(v[k/2],v[k]);
        swap(nr[k/2],nr[k]);
        C[nr[k]]=k;
        C[nr[k/2]]=k/2;
        k=k/2;
    }
}
void up(int x)
{
     while(x/2>0&&v[x]<v[x/2])
    {
        swap(v[x/2],v[x]);
        swap(nr[x/2],nr[x]);
        C[nr[x]]=x;
        C[nr[x/2]]=x/2;
        x=x/2;
    }
}
void down(int x)
{   int poz=x;
    int ok=1;
    while(ok)
   {if(2*x<v.size())
        if(v[x]>v[2*x])
            poz=2*x;
    if(2*x+1<v.size())
        if(v[2*x+1]<v[poz])
         poz=2*x+1;
    if(poz==x)
        ok=0;
    else
    {
    swap(v[x],v[poz]);
    swap(nr[x],nr[poz]);
    C[nr[x]]=x;
    C[nr[poz]]=poz;
    x=poz;
   }
   }
}
void delet(int poz)
{
    swap(v[poz],v[v.size()-1]);
    swap(nr[poz],nr[v.size()-1]);
    nr.pop_back();
    v.pop_back();
    int aux=poz;
    up(poz);
    if(aux==poz)
        down(poz);

}

    int main()
    {
        int x,y;
        f>>N;
        v.push_back(-1);
        nr.push_back(-1);
        for(int i=1; i<=N; i++)
        {
            f>>x;
            if(x==1)
            {
                f>>y;
                ad_heap(y);
            }
            else if(x==2)
            {
                f>>y;
                delet(C[y]);
            }
            else g<<v[1]<<endl;
        }
        return 0;
    }