Cod sursa(job #3311625)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 23 septembrie 2025 16:05:48
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <vector>

using namespace std;
const int NMAX = 200000;

ifstream cin("heapuri.in");
ofstream cout("heapuri.out");

int v[NMAX + 2], pos[NMAX + 2];
int heap[NMAX + 2]; ///pastram id-urile

void up(int start) {
    if(start == 1)
        return;
    int tata = start / 2;
    if(v[heap[tata]] > v[heap[start]]) { ///urcam start-ul
        swap(pos[heap[tata]], pos[heap[start]]); ///swap ca urcam
        swap(heap[tata], heap[start]);
        up(tata);
    }
}
int n = 0;

void down(int start) {
    int fiust = 2 * start, fiudr = 2 * start + 1;
    if(fiudr <= n) { ///exista ambii fii
        if(v[heap[start]] <= v[heap[fiust]] &&
           v[heap[start]] <= v[heap[fiudr]]) ///e ok
            return;
        int minn = fiust; ///luam fiul cu val <
        if(v[heap[fiudr]] < v[heap[fiust]])
            minn = fiudr;
        swap(pos[heap[minn]], pos[heap[start]]); ///coboram, swap
        swap(heap[minn], heap[start]);
        down(minn);
    }
    else if(fiust <= n) { ///are un singur fiu
        if(v[heap[fiust]] < v[heap[start]]) { ///swap
            swap(pos[heap[fiust]], pos[heap[start]]);
            swap(heap[fiust], heap[start]);
            down(fiust);
        }
    }
}


int main()
{
    int t, cnt = 0;
    cin >> t;
    while(t--) {
        int tip, a;
        cin >> tip;
        if(tip == 1) { ///adaugam elem nou
            cin >> a;
            n++, cnt++;
            v[cnt] = a, pos[cnt] = n;
            heap[n] = cnt;
            up(n);
        }
        else if(tip == 2) { ///stergi elem de pe poz a
            cin >> a;
            int id = pos[a];
            swap(pos[a], pos[heap[n]]);
            swap(heap[id], heap[n]);
            n--; ///scoatem nod
            down(id);
            up(id); ///poate sa vina si de pe alta ramura
        }
        else
            cout << v[heap[1]] << '\n';
    }
    return 0;
}