Cod sursa(job #2728339)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 23 martie 2021 08:56:46
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
//Ilie Dumitru
#include<cstdio>

int N, added;
int heap[200000];
int pos[200000];
int invPos[200000];

void heapSwap(int a, int b)
{
    pos[invPos[a]]=b;
    pos[invPos[b]]=a;
    int aux=invPos[a];
    invPos[a]=invPos[b];
    invPos[b]=aux;
}

void push(int x)
{
    int p=N++;
    while(p && heap[(p-1)>>1]>x)
    {
        heapSwap(p, (p-1)>>1);
        heap[p]=heap[(p-1)>>1];
        p=(p-1)>>1;
    }
    heap[p]=x;
}

void up(int &p)
{
    int x=heap[p];
    while(p && heap[(p-1)>>1]>x)
    {
        heapSwap(p, (p-1)>>1);
        heap[p]=heap[(p-1)>>1];
        p=(p-1)>>1;
    }
    heap[p]=x;
}

void down(int &p)
{
    bool ok=true;
    while((p<<1)+2<N && ok)
    {
        if(heap[(p<<1)+1]<heap[p] && heap[(p<<1)+1]<heap[(p<<1)+2])
        {
            heapSwap(p, (p<<1)+1);
            int a=heap[p];
            heap[p]=heap[(p<<1)+1];
            heap[(p<<1)+1]=a;
            p=(p<<1)+1;
        }
        else if(heap[(p<<1)+2]<heap[p])
        {
            heapSwap(p, (p<<1)+2);
            int a=heap[p];
            heap[p]=heap[(p<<1)+2];
            heap[(p<<1)+2]=a;
            p=(p<<1)+2;
        }
        else
            ok=false;
    }
    if((p<<1)+1<N && heap[(p<<1)+1]<heap[p])
    {
        heapSwap(p, (p<<1)+1);
        int a=heap[p];
        heap[p]=heap[(p<<1)+1];
        heap[(p<<1)+1]=a;
        p=(p<<1)+1;
    }
}

void pop(int p)
{
    heap[pos[p]]=heap[--N];
    pos[invPos[N]]=pos[p];
    invPos[pos[p]]=invPos[N];
    p=pos[p];
    up(p);
    down(p);
}

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    int N, op, x, i;
    scanf("%i", &N);
    for(x=0;x<N;++x)
        pos[x]=x;
    for(i=0;i<N;++i)
    {
        scanf("%i", &op);
        switch(op)
        {
        case 1:
        {
            scanf("%i", &x);
            pos[added]=::N;
            invPos[::N]=added++;
            push(x);
            break;
        }
        case 2:
        {
            scanf("%i", &x);
            pop(x-1);
            break;
        }
        case 3:
        {
            printf("%i\n", heap[0]);
            break;
        }
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}