Cod sursa(job #2438554)

Utilizator Cezar211Popoveniuc Cezar Cezar211 Data 12 iulie 2019 18:12:43
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 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 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])
    {
        swap(a[b[cur]], a[b[cur/2]]);
        swap(b[cur], b[cur/2]);
        swap(v[cur], v[cur/2]);
        cur = cur/2;
    }
}
void op_2(int x)
{
    v[a[x-1]] = v[n];
    --n;
    int cur = a[x-1];
    swap(a[x-1], a[b[n]]);
    swap(b[a[x-1]], b[n]);
    while(cur <= n/2 && (v[cur] > v[cur*2] || v[cur] > v[cur*2+1]))
    {
        if(v[cur*2] < v[cur*2+1])
        {
            swap(a[b[cur]], a[b[cur*2]]);
            swap(b[cur], b[cur*2]);
            swap(v[cur], v[cur*2]);
            cur = cur*2;
        }
        else
        {
            swap(a[b[cur]], a[b[cur*2+1]]);
            swap(b[cur], b[cur*2+1]);
            swap(v[cur], v[cur*2+1]);
            cur = cur*2+1;
        }
    }
}
int main()
{
    fin >> NR_OP;
    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;
}