Cod sursa(job #3174907)

Utilizator matei__bBenchea Matei matei__b Data 25 noiembrie 2023 10:48:01
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ld long double
#define chad char
#define mod 1000000007
#define dim 100005
#define lim 1000000
#define mdim 1501
#define mult 2e9
#define maxx 200002
#define simaimult 1e17
#define FOR(i,a,b) for(int i=(a); i<=(b); i++)
#define pli pair<ll,int>
#define pil pair<int,ll>
#define piii pair<int,pair<int,int> > 
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define mp make_pair
#define nr_biti __builtin_popcount
using namespace std;
 
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int h[2*dim],n,pos,q;
int ind[2*dim]; // pe ce pozitie in heap se afla al i-lea element intrat

void inserare(int x)
{
    int son=n+1;
    int daddy=son/2;

    while(daddy>0 && h[daddy]>x)
    {
        h[son]=h[daddy];
        
        //ind[son]=daddy;
        ind[daddy]=son;

        son=daddy;
        daddy=son/2;
    }

    h[son]=x;
    ind[n+1]=son;
    ++n;
}

void combi(int pos)
{
    int son=2*pos,daddy=pos,x=h[pos];

    while(son<=n)
    {
        if(son+1<=n && h[son+1]<h[son])
            son++;

        if(h[son]<x)
        {
            h[daddy]=h[son];
            ind[son]=daddy;
            daddy=son;
            son=2*daddy;
        }
        else 
            break;
    }
}

void create_combi()
{
    for(int i=n/2; i>=1; i--)
        combi(i);
}

int minim()
{
    int aux=h[1];

    h[1]=h[n];
    --n;

    combi(1);

    return aux;
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr); 

    fin >> q;

    while(q--)
    {
        int tip;

        fin >> tip;

        if(tip==1)
        {
            int x;

            fin >> x;

            inserare(x);
        }
        else if(tip==2)
        {
            int x;

            fin >> x;

            /*
            for(int i=1; i<=n; i++)
                cout << ind[i] << " ";

            break;*/

            h[ind[x]]=h[n];

            n--;
            combi(ind[x]);
        }
        else 
        {
            fout << h[1] << "\n";
        }
    }    

    return 0;
}