Cod sursa(job #2617677)

Utilizator VladAlexandruAnghelache Vlad VladAlexandru Data 22 mai 2020 16:50:01
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct nod
{
    int x,y;
};

vector<nod> heap;
int parinte(int x)
{
    return (x-1)/2;
}
int fiu_st(int x)
{
    return 2*(x+1)-1;
}
int fiu_dr(int x)
{
    return 2*(x+1);
}
void insrt(nod n)
{
    heap.push_back(n);
    int i=heap.size();
    heap[i-1].x=i;
    i--;
    while(i>0&&heap[parinte(i)].y>heap[i].y)
    {
        nod aux=heap[i];
        heap[i]=heap[parinte(i)];
        heap[parinte(i)]=aux;
        i=parinte(i);
    }
}
void del(int j)
{
    unsigned i=0;
    while(j!=heap[i].x&&i<heap.size())
        i++;
    while(i<heap.size())
    {
        if(fiu_dr(i)<heap.size()&&fiu_st(i)>=heap.size())
        {
            heap[i]=heap[fiu_dr(i)];
            if(fiu_dr(fiu_st(i))>=heap.size()&&fiu_dr(fiu_dr(i))>=heap.size())
            {
                heap.erase(heap.begin()+fiu_dr(i));
                break;
            }
            i=fiu_dr(i);
        }
        else if(fiu_st(i)<heap.size()&&fiu_dr(i)>=heap.size())
        {
            heap[i]=heap[fiu_st(i)];
            if(fiu_st(fiu_st(i))>=heap.size()&&fiu_st(fiu_dr(i))>=heap.size())
            {
                heap.erase(heap.begin()+fiu_st(i));
                break;
            }
            i=fiu_st(i);

        }
        else if(heap[fiu_dr(i)].y<heap[fiu_st(i)].y)
        {
            heap[i]=heap[fiu_dr(i)];
            if(fiu_st(fiu_st(i))>=heap.size()&&fiu_st(fiu_dr(i))>=heap.size())
            {
                heap.erase(heap.begin()+fiu_dr(i));
                break;
            }
            i=fiu_dr(i);
        }
        else
        {
            heap[i]=heap[fiu_st(i)];
            if(fiu_dr(fiu_st(i))>=heap.size()&&fiu_dr(fiu_dr(i))>=heap.size())
            {
                heap.erase(heap.begin()+fiu_st(i));
                break;
            }
            i=fiu_st(i);
        }
    }

}

int main()
{
    int n;
    fin>>n;
    int i=0;
    while(n--)
    {

        int op;
        fin>>op;
        if(op==1)
        {
            nod x;
            fin>>x.y;

            insrt(x);

        }
        else if(op==2)
        {
            int x;
            fin>>x;
            del(x);
        }
        else{
            fout<<heap[0].y<<"\n";
        }

    }
    return 0;
}