Cod sursa(job #2438577)

Utilizator Cezar211Popoveniuc Cezar Cezar211 Data 12 iulie 2019 19:49:08
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define NM 4*200005
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int NR_OP, op, n, x, v[NM];
int b[NM/4];///pt poz ord
vector<int> a;///pt ord poz
void schimb(int p1, int p2)
{
    swap(b[p1], b[p2]);
    a[b[p1]] = p1;
    a[b[p2]] = p2;
    swap(v[p1], v[p2]);
}
void op_1(int x)
{
    ++n;
    v[n] = x;
    int cur = n;
    a.push_back(cur);
    b[cur] = a.size()-1;
    while(cur > 1 && v[cur] < v[cur/2])
    {
        schimb(cur, cur/2);
        cur = cur/2;
    }
}
void op_2(int x)
{
    int cur = a[x];
    schimb(a[x], n);
    v[n] = INT_MAX;
    --n;
    while(cur > 1 && v[cur] < v[cur/2])
    {
        schimb(cur, cur/2);
        cur = cur/2;
    }
    while(cur <= n/2 && (v[cur] > v[cur*2] || v[cur] > v[cur*2+1]))
    {
        if(v[cur*2] <= v[cur*2+1])
        {
            schimb(cur, cur*2);
            cur = cur*2;
        }
        else
        {
            schimb(cur, cur*2+1);
            cur = cur*2+1;
        }
    }
}
int main()
{
    fin >> NR_OP;
    a.push_back(0);
    for(int i=1; i<=4*NR_OP+1; i++)
        v[i] = INT_MAX;
    for(;NR_OP--;)
    {
        fin >> op;
        if(op!=3)
            fin >> x;
        if(op == 1)
            op_1(x);
        else if(op == 2)
            op_2(x);
        else fout << v[1] << '\n';
    }
    return 0;
}