Cod sursa(job #2085088)

Utilizator DeleDelegeanu Alexandru Dele Data 9 decembrie 2017 18:01:36
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int MAX_HEAP_SIZE=200001;
typedef int Heap[MAX_HEAP_SIZE];
Heap H;
int N,i,cod,poz,x,n,v[200001];
int tata(int nod){return nod/2;}
int fiu_s(int nod){return nod*2;}
int fiu_d(int nod){return nod*2+1;}
void sift(Heap H,int n,int k){///  COBOARA
    int fiu;
    do{
        fiu=0;
        ///  ALEGE UN FIU < TATAL
        if(fiu_s(k)<=n)
        {
            fiu=fiu_s(k);
            if(fiu_d(k)<=n&&H[fiu_d(k)]<H[fiu_s(k)])
                fiu=fiu_d(k);
            if(H[fiu]>=H[k])
                fiu=0;
        }
        if(fiu)
        {
            swap(H[k],H[fiu]);
            k=fiu;
        }
    }while(fiu);
}
void percolate(Heap H,int n,int k) {/// URCA
    int key=H[k];
    while((k>1)&&(key<H[tata(k)]))
    {
        H[k]=H[tata(k)];
        k=tata(k);
    }
    H[k]=key;
}
void cut(Heap H,int&n,int k) { ///TAIE EL. DE PE POZ K
    H[k]=H[n];
    --n;
    if((k>1)&&(H[k]<H[tata(k)]))
        percolate(H,n,k);
    else
        sift(H,n,k);
}
void insert(Heap H,int&n,int key){
    H[++n]=key;
    percolate(H,n,n);
}
int pozitia_stergere(int x,int n,Heap H){//al x-lea el intrat in multime
   int i;
   for(i=1 ; i<=n ; ++i)
    if(H[i]==x)break;
   return i;
}
int main()
{
    f>>N;
    for(i=1 ; i<=N ; ++i)
    {
        f>>cod;
        if(cod==3)
            g<<H[1]<<'\n';
        else
        {
            f>>x;
            if(cod==1)
            {
                 insert(H,n,x);
                 v[n]=x;
            }
            else
            {
                poz=pozitia_stergere(v[x],n,H);
                cut(H,n,poz);
            }
        }
    }
    return 0;
}