Cod sursa(job #1956936)

Utilizator andysoloAndrei Solo andysolo Data 7 aprilie 2017 10:20:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#define NMAX 200000+5
#define f first
#define s second

using namespace std;

int N;
pair<int,int> v[NMAX];
int a[NMAX];

void HeapUp(int);
void HeapDown(int,int);

void HeapUp(int j)
{
    if(j==1)
        return;
    else if(v[j]<v[j/2])
    {
        swap(v[j],v[j/2]);
        HeapUp(j/2);
    }
}

void HeapDown(int f,int k)
{
    int st,dr,i;
    if(2*f<=k)
    {
        st=v[2*f].f;
        if(2*f+1<=k)
            dr=v[2*f+1].f;
        else dr=st+1;

        if(st<dr)
            i=2*f;
        else i=2*f+1;

        if(v[f]>v[i])
        {
            swap(v[f],v[i]);
            HeapDown(i,k);
        }
    }
}

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

    scanf("%d",&N);
    int k=0;
    int ct=0;

    for(int i=1; i<=N; i++)
    {
        int t;
        scanf("%d",&t);
        if(t==1)
        {
            int x;
            scanf("%d",&x);
            k++;
            ct++;
            v[k]={x,ct};
            a[ct]=k;
            HeapUp(k);
        }
        else if(t==2)
        {
            int x;
            scanf("%d",&x);
            int p=a[x];
            swap(v[p],v[k]);
            k--;
            HeapDown(p,k);
        }
        else if(t==3)
            printf("%d",v[1]);
    }
    return 0;
}