Pagini recente » Cod sursa (job #1281284) | Istoria paginii runda/wettbewerbssimulation3 | Cod sursa (job #1968645) | Cod sursa (job #244566) | Cod sursa (job #2079249)
#include<cstdio>
#include<algorithm>
#define f first
#define s second
using namespace std;
pair<int,int> heap[200002]; ///<element, al catelea a fost inserat>
int lgHeap=0;
bool removed[200002];
void heap_up(int poz){
while (poz>1) {
if (heap[poz].f<heap[poz/2].f) {swap(heap[poz], heap[poz/2]); poz/=2;}
else break;
}
}
void heap_down(int poz){
while (2*poz<=lgHeap) {
if (2*poz+1<=lgHeap){
///compar stanga-dreapta
///stanga e mai mica
if ((heap[2*poz].f<heap[2*poz+1].f)&&(heap[2*poz].f<heap[poz].f)) {
swap(heap[poz], heap[2*poz]);
poz*=2; continue;
} else
///dreapta e mai mica
if ((heap[2*poz].f>heap[2*poz+1].f)&&(heap[2*poz+1].f<heap[poz].f)) {
swap(heap[poz], heap[2*poz+1]);
poz=2*poz+1; continue;
}
}
else {
///compar doar cu stanga pt ca nu exista dreapta
if (heap[2*poz].f<heap[poz].f) {
swap(heap[poz], heap[2*poz]);
poz*=2; continue;
}
}
}
}
int findMin(){
while (removed[heap[1].s]) {
swap(heap[1], heap[lgHeap]);
heap[lgHeap]=make_pair(0,0); lgHeap--;
heap_down(1);
}
return heap[1].f;
}
int main(){
int n, step, i, op, x;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d", &n);
step=0;
for (i=1;i<=n;i++) {
scanf("%d", &op); if (op<3) scanf("%d", &x);
switch(op){
case 1: {heap[++lgHeap]=make_pair(x, ++step); removed[x]=false; heap_up(lgHeap); break;}
case 2: {removed[x]=true; break;}
case 3: {printf("%d\n", findMin()); break;}
}
}
return 0;
}