Cod sursa(job #1366733)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 1 martie 2015 13:24:01
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <cstdio>
#include <algorithm>

#define Nmax 200005

using namespace std;
class Heap{
private:
    int Size;
    int elem[Nmax]; /// elem[i] -> elementul de pe pozitia i
    int poz[Nmax]; /// poz[i] -> pe ce pozitie se afla elementul bagat al i lea
    int timp[Nmax];   /// timp[i] -> al catalea element a fost bagat cel de pe pozitia i
public:
    Heap(){
        Size = 0;
    }
    int tata(int k){
        return k>>1;
    }
    int fiu_stg(int k){
        return k<<1;
    }
    int fiu_drept(int k){
        return (k<<1)|1;
    }

    void Upheap(int nodc){
        int val = elem[nodc];
        int pzvechi = timp[nodc];
        int ordvechi = poz[timp[nodc]];

        while(tata(nodc) != 0 && elem[tata(nodc)] > elem[nodc])
        {
            elem[nodc] = elem[tata(nodc)];
            poz[nodc] = poz[timp[tata(nodc)]];
            timp[nodc] = timp[tata(nodc)];

            nodc = tata(nodc);
        }

        elem[nodc] = val;
        timp[nodc] = pzvechi;
        poz[timp[nodc]] = ordvechi;
    }
    void Downheap(int nodc){

        int val = elem[nodc];
        int pzvechi = timp[nodc];

        while(1){
            int cine = nodc;
            if(fiu_stg(nodc) <= Size && elem[fiu_stg(nodc)] < elem[nodc])
                cine = fiu_stg(nodc);
            if(fiu_drept(nodc) <= Size && elem[fiu_drept(nodc)] < elem[cine])
                cine = fiu_drept(nodc);

            if(cine == nodc)
                break;

            elem[nodc] = elem[cine]; /// elem curent devine fiul
            timp[nodc] = timp[cine];
            poz[nodc] = poz[timp[nodc]];

            nodc = cine;
        }
        elem[nodc] = val;
        timp[nodc] = pzvechi;
        poz[timp[nodc]] = nodc;
    }

    void Insert(int k,int crt){
        Size++;

        elem[Size] = k;
        poz[Size] = crt;
        timp[crt] = Size;

        Upheap(Size);
    }
    void Delete(int crt){
        int pz = poz[crt];
        swap(elem[pz],elem[Size]);
        swap(poz[crt],poz[timp[Size]]);
        Size--;
        Downheap(pz);

    }

};

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);


    return 0;
}