Cod sursa(job #696276)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 28 februarie 2012 17:48:40
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
using namespace std;

int val[200010],h[200010],n,m,nr;


int maxx(int a,int b)
{
    if(val[a]>val[b])
        return a;
    return b;
}

void sift(int i)
{
    if(val[h[i]]>val[h[i*2]]&&h[i*2])
    {
        if(val[h[i]]>val[h[i*2+1]]&&h[i*2+1])
        {
            int s=maxx(h[i*2],h[i*2+1]);
            swap(h[i],h[s]);
            sift(s);
        }
        else
        {
            swap(h[i],h[i*2]);
            sift(i*2);
        }
    }
    else
    {
        if(val[h[i]]>val[h[i*2+1]]&&h[i*2+1])
        {
            swap(h[i],h[i*2+1]);
            sift(i*2+1);
        }
    }
    return;
}

void percolate(int i)
{
    if(val[h[i]]<val[h[i/2]])
    {
        swap(h[i],h[i/2]);
        percolate(i/2);
    }
}

int search(int i,int x)
{
    if(!h[i])
        return 0;
    if(h[i]==x)
        return i;
    else
    {
        if(val[h[i*2]]<=val[x]&&val[h[i*2+1]]<val[x])
            return search(i*2,x);
        if(val[h[i*2+1]]<=val[x]&&val[h[i*2]]<val[x])
            return search(i*2+1,x);
        return maxx(search(i*2+1,x),search(i*2,x));
    }
}

void insert(int x)
{
    val[++nr]=x;
    h[++m]=nr;
    if(val[h[m/2]]>val[h[m]])
    {
        swap(h[m/2],h[m]);
        percolate(m/2);
    }
}

void delet(int x)
{
    int i=search(1,x);
    h[i]=h[m];h[m--]=0;
    if(val[h[i]]<val[h[i/2]])
        percolate(i);
    else
        sift(i);
}
int main()
{
    ifstream f("heapuri.in");
    f>>n;
    int o;
    ofstream g("heapuri.out");
    for(int i=0;i<n;i++)
    {
        f>>o;int x;
        switch(o)
        {
            case 1: f>>x; insert(x);break;
            case 2: f>>x; delet(x);break;
            case 3: g<<val[h[1]]<<'\n';
        }
    }
    return 0;
}