Cod sursa(job #790461)

Utilizator ioana.teocIoana Teoc ioana.teoc Data 21 septembrie 2012 14:23:54
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
//
//  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 i){
    if(i == 1) return;
    if(A[Heap[i/2]] > A[Heap[i]]){
        swap(Pos[Heap[i]], Pos[Heap[i/2]]);
        swap(Heap[i], Heap[i/2]);
        up(i/2);
    }
}

void down(int i){
    int min = i;
    if(2*i <= heapSize && A[Heap[2*i]] < A[Heap[i]])
        min = 2*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]);
        down(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(i > 1 && A[Heap[i]] < A[Heap[i/2]]){
        up(i);
    }
    else
        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;
        }
            
    }
    
}