Cod sursa(job #3163257)

Utilizator laura2020Moldovan Laura laura2020 Data 31 octombrie 2023 10:06:19
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
#define dim  200005
vector<pair<int,int>> v;
int pos[dim];
void HeapAdd(int x,int poz)
{
    int cnt=v.size();
    v.push_back(make_pair(x,poz));
    pos[poz]=cnt;
    while(cnt!=1 && v[cnt].first<v[cnt/2].first)
    {
        swap(v[cnt],v[cnt/2]);
        swap(pos[v[cnt].second],pos[v[cnt/2].second]);
        cnt/=2;
    }

}
int copilMic(int i)
{
    int mini=-1,poz=-1;
    if(i*2<v.size() && v[i].first>v[i*2].first)
        mini=v[i*2].first,poz=i*2;
    if(i*2+1<v.size() && v[i].first>v[i*2+1].first && (mini==-1 || mini>v[i*2+1].first))
        poz=i*2+1;
    return poz;
}
void HeapErase(int x)
{
    int poz=pos[x];
    int cnt;
    swap(v[poz],v[v.size()-1]);
    swap(pos[v[poz].second],pos[v[v.size()-1].second]);
    v.pop_back();
    while(poz!=1 && v[poz].first<v[poz/2].first)
    {
        swap(v[poz],v[poz/2]);
        swap(pos[v[poz].second],pos[v[poz/2].second]);
        poz/=2;
    }
    while(poz<v.size() && copilMic(poz)!=-1)
    {
        cnt=copilMic(poz);
        swap(v[poz],v[cnt]);
        swap(pos[v[poz].second],pos[v[cnt].second]);
        poz=cnt;
    }
}

int main()
{
    int n,x,op,i,cntAd=0;
    fin>>n;
    v.resize(1);
    for(i=0;i<n;i++)
    {
        fin>>op;
        if(op==1)
        {
            fin>>x;
            HeapAdd(x,cntAd+1);
            cntAd++;
        }
        else if(op==2)
        {
            fin>>x;
            HeapErase(x);
        }
        else
        {
            fout<<v[1].first<<'\n';
        }
    }
    return 0;
}