Cod sursa(job #1594000)

Utilizator NicusorTelescu Nicolae Nicusor Data 9 februarie 2016 09:04:49
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <cstdio>

using namespace std;

int cnt,n;

struct poz
{
    int nr,ordin;
}v[200001];

int v_poz[200001];

void swap(int &a,int &b)
{
    int c=a;
    a=b;
    b=c;
}

void up(int i)
{
    if (v[i].nr<v[i/2].nr && i!=1)
    {
        swap(v[i].nr,v[i/2].nr);
        swap(v[i].ordin,v[i/2].ordin);
        swap(v_poz[v[i].ordin],v_poz[v[i/2].ordin]);
        up(i/2);
    }
}

void down(int i)
{
    if (n==i*2)
    {
        if (v[i].nr>v[i*2].nr)
        {
            swap(v[i].nr,v[i*2].nr);
            swap(v[i].ordin,v[i*2].ordin);
            swap(v_poz[v[i].ordin],v_poz[v[i*2].ordin]);
            down(i*2);
        }
    }
    else
    {
        if (n>i*2)
        {
            int min1=v[i*2].nr,poz1=i*2;
            if (min1>v[i*2+1].nr)
            {
                min1=v[i*2+1].nr;
                poz1=i*2+1;
            }
            if (min1<v[i].nr)
            {
                swap(v[i].nr,v[poz1].nr);
                swap(v[i].ordin,v[poz1].ordin);
                swap(v_poz[v[i].ordin],v_poz[v[poz1].ordin]);
                down(poz1);
            }
        }
    }
}

void operatia1()
{
    int x;
    scanf("%d ",&x);
    n++;
    cnt++;
    v[n].nr=x;
    v[n].ordin=cnt;
    v_poz[cnt]=n;
    up(n);
}

void operatia2()
{
    int a2;
    scanf("%d ",&a2);
    poz a1=v[n];
    v_poz[v[n].ordin]=v_poz[a2];
    n--;
    v[v_poz[a2]].nr=a1.nr;
    v[v_poz[a2]].ordin=a1.ordin;
    down(v_poz[a2]);
}

void operatia3()
{
    printf("%d\n",v[1].nr);
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int m;
    scanf("%d ",&m);
    for (int i=1;i<=m;i++)
    {
        int a;
        scanf("%d ",&a);
        if (a==1)
            operatia1();
        if (a==2)
            operatia2();
        if (a==3)
            operatia3();
    }
}