Pagini recente » Cod sursa (job #23794) | Cod sursa (job #2205935) | Cod sursa (job #462228) | Cod sursa (job #2299602) | Cod sursa (job #790435)
Cod sursa(job #790435)
//
// main.cpp
// Heapuri
//
// Created by Ioana Teoc on 9/16/12.
// Copyright (c) 2012 Ioana Teoc. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#define MAXN 200010
using namespace std;
int Heap[MAXN], Pos[MAXN], A[MAXN];
int n, heapSize, posSize;
void up(int j){
int i = j;
while(i > 1 && A[Heap[i/2]] > A[Heap[i]]){
swap(Pos[Heap[i]], Pos[Heap[i/2]]);
swap(Heap[i], Heap[i/2]);
i = i/2;
}
}
void down(int j){
int min = 0, i = j;
while(true){
if(2*i <= heapSize && A[Heap[2*i]] < A[Heap[i]])
min = 2*i;
else
min = i;
if(2*i+1 <= heapSize && A[Heap[2*i+1]] < A[Heap[min]])
min = 2*i + 1;
if(i == min) return;
else{
swap(Pos[Heap[i]], Pos[Heap[min]]);
swap(Heap[i], Heap[min]);
i = min;
}
}
}
void push(int x){
A[++posSize] = x;
Heap[++heapSize] = posSize;
Pos[posSize] = heapSize;
up(heapSize);
}
void pop(int x){
int i = Pos[x];
Heap[i] = Heap[heapSize--];
Pos[Heap[i]] = i;
if(A[Heap[i]] < A[Heap[i/2]]){
up(i);
}
if(A[Heap[i]] > A[Heap[2*i]] || A[Heap[i]] > A[Heap[2*i+1]]){
down(i);
}
}
int main(int argc, const char * argv[])
{
int op, x;
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
cin >>n;
for(int i = 1; i <= n; i++){
cin >> op;
if(op == 1){
cin >> x;
push(x);
}
else if (op == 2){
cin >> x;
pop(x);
}
else if(op == 3){
cout << A[Heap[1]] << endl;
}
}
}