Cod sursa(job #2746602)

Utilizator Virgil993Virgil Turcu Virgil993 Data 28 aprilie 2021 02:35:06
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <iostream>
#include<bits/stdc++.h>

using namespace std;

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



long long pos[200001] = {-1};

void urca(int indice,vector<long long> &v)
{
    int parinte = indice /2;
    while(v[parinte]>v[indice])
    {
        long long aux = v[parinte];
        v[parinte] = v[indice];
        v[indice] = aux;
        indice = parinte;
        parinte = indice /2;
    }
}

void coboara(int indice,vector<long long > &v)
{
    int n = v.size();
    int right = indice*2+2;
    int left = indice*2+1;
    if(right < n)
    {
        if(v[left]< v[right])
        {
            if(v[indice]>v[left])
            {
                long long aux = v[indice];
                v[indice] = v[left];
                v[left] = aux;
                coboara(left,v);
            }

        }
        else
        {
            if(v[indice]>v[right])
            {
                long long aux = v[indice];
                v[indice] = v[right];
                v[right] = aux;
                coboara(right,v);
            }
        }
    }
    else
     if(left < n)
        if(v[indice] > v[left])
    {
                long long aux = v[indice];
                v[indice] = v[left];
                v[left] = aux;
                coboara(left,v);
    }
}

void inserare(long long el,vector<long long> &v,long long pos[200001])
{
    v.push_back(el);
    urca(v.size()-1,v);
    pos[v.size()-1] = el;


}

void del(int indice,vector<long long> &v,long long pos[200001])
{
    for(int i=0;i<v.size();i++)
        if(pos[indice]== v[i])
    {
        indice = i;
        break;
    }

    v[indice] = v[v.size()-1];
    v.pop_back();
    coboara(indice,v);
    urca(indice,v);
}
int main()
{
    vector<long long> v;
    int n;
    int comanda;
    fin>>n;
    for(int i=0;i<n;i++)
    {
        fin>>comanda;
        if(comanda == 1)
        {
            long long el;
            fin>>el;
            inserare(el,v,pos);
        }
        if(comanda == 2)
        {
            int indx;
            fin>>indx;
            del(indx-1,v,pos);
        }
        if(comanda == 3)
        {
            fout<<v[0]<<'\n';
        }
    }





    return 0;
}