Pagini recente » Monitorul de evaluare | Cod sursa (job #3311608) | Cod sursa (job #535714) | Cod sursa (job #838268) | Cod sursa (job #3311625)
#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;
}