Cod sursa(job #2483574)

Utilizator E1goBack Andrei-Gheorghe E1go Data 29 octombrie 2019 21:57:37
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int v[200001], poz[200001], pozh[200001], k;

void Up(int nr)
{
    int fiu=k;
    int tata=fiu/2;
    while(tata && nr < v[tata])
    {
        pozh[v[tata]]=fiu;
        v[fiu]=v[tata];
        fiu=tata;
        tata=fiu/2;
    }
    v[fiu]=nr;
    pozh[v[fiu]]=fiu;
}

void Down(int n)
{
    int i=n;
    while(2*i <= k && v[i]>min(v[2*i], v[2*i+1]))
    {
        if(2*i+1 > k)
        {
            if(v[i] > v[2*i])
                swap(v[i], v[2*i]);
            i*=2;
        }
        else
        {
            if(v[2*i] < v[2*i+1])
            {
                if(v[2*i] < v[i])
                    swap(v[2*i], v[i]);
                i*=2;
            }
            else
            {
                if(v[2*i+1] < v[i])
                    swap(v[2*i+1], v[i]);
                i*=2;
                i++;
            }
        }
    }
}

int main()
{
    int x, nr, n;
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>x;
        if(x==1)
        {
            fin>>nr;
            k++;
            poz[k]=nr;
            pozh[nr]=k;
            Up(nr);
        }
        else
         if(x==2)
        {
          fin>>nr;
          v[pozh[poz[nr]]]=v[k--];
          Down(pozh[poz[nr]]);
        }
        else
        {
            fout<<v[1]<<"\n";
        }
    }
    return 0;
}