Cod sursa(job #2727743)

Utilizator emanuel2186Lugojan Emanuel emanuel2186 Data 22 martie 2021 14:03:50
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.53 kb
#include <bits/stdc++.h>
#define Nmax 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
/**

operatia de tipul 1: se insereaza elementul x in multime
operatia de tipul 2: se sterge elementul intrat al x-lea in multime, in ordine cronologica
operatia de tipul 3: se afiseaza elementul minim din multime

*/
int N, cer, x;
int v[Nmax];
int Heap[Nmax];
void change(int x, int y)
{
    swap(Heap[x], Heap[y]);
}
int compar(int fiu, int tata)
{
    if(Heap[fiu] < Heap[tata])
    {
        return 1;
    }
    return 0;
}
void heap_up(int poz)
{
    ///compar cu tatal
    int tata = poz / 2;
    if(tata != 0)
    {

        if(compar(poz, tata) == 1)
        {
            ///schimbam nodurile
            change(poz, tata);
            ///continuam
            heap_up(tata);
        }
    }
}
void adaug(int val)
{
    Heap[0]++;
    int k = Heap[0];
    Heap[k] = val;
    heap_up(k);
}
void heap_down(int tata)
{
    int fiu = tata * 2;
    if(fiu <= Heap[0])///daca fiul exista
    {
        if(compar(fiu, tata) == 1)
        {
            change(fiu, tata);
            heap_down(fiu);
        }
        else
        {
            ///verific cu al doilea fiu
            fiu++;
            if(fiu <= Heap[0])///daca fiul din dreapta exista
            {
                if(compar(fiu, tata) == 1)
                {
                    change(fiu, tata);
                    heap_down(fiu);
                }
            }
        }
    }
}
int cautare(int val)
{
    for(int i=1; i<=Heap[0]; i++)
    {
        if(Heap[i] == val)
            return i;
    }
    return 0;
}
void stergere(int val)
{
    int poz = cautare(val);///pozitia din heap a valorii val
    Heap[poz] = INT_MAX;
    heap_down(poz);
}
void citire()
{
    fin>>N;
    for(int i=1; i<=N; i++)
    {

        fin>>cer;
        if(cer == 1 || cer == 2)
        {
            fin>>x;
            ///operatia de tipul 1: se insereaza elementul x in multime
            if(cer == 1)
            {
                v[ ++v[0] ] = x;
                adaug(x);
            }
            else
            {
                ///operatia de tipul 2: se sterge elementul intrat al x-lea in multime, in ordine cronologica
                int elem = v[ x ];
                stergere(elem);
            }
        }
        else
        {
            fout<<Heap[1]<<"\n";
        }

    }
}
void afisare()
{

}
int main()
{
    citire();
    afisare();
    return 0;
}