Cod sursa(job #867772)

Utilizator razvan.popaPopa Razvan razvan.popa Data 30 ianuarie 2013 08:40:20
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<iostream>
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<algorithm>
#define INF (1 << 30)
#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define ll long long
#define nxt (*it)
#define type int
#define FORi(i,a,b)\
   for(int i=a; i<=b; ++i)
#define FORr(g)\
   for(vector<type>::reverse_iterator it=g.rbegin(); it!=g.rend(); ++it)
#define FOR(g)\
   for(vector<type>::iterator it=g.begin(); it!=g.end(); ++it)
#define infile "heapuri.in"
#define outfile "heapuri.out"
#define nMax 200005
using namespace std;

int H[nMax], NH;

int pos[nMax], val[nMax];

int N;


void push(int el){
	pos[el] = ++ NH;
	H[NH] = el;

	int x = NH;
	while(x > 1 && val[H[x]] < val[H[x/2]]){
		swap(pos[H[x]], pos[H[x/2]]);
		swap(H[x], H[x/2]);

		x = x/2;
	}
}

void erase(int x){
	H[x] = H[NH--];
	pos[H[x]] = x;

	int rs, ls, son;
	while(true){
		ls = 2 * x;
		rs = 2 * x + 1;
		son = x;

		if(ls <= NH && val[H[ls]] < val[H[son]])
			son = ls;
		if(rs <= NH && val[H[rs]] < val[H[son]])
			son = rs;

		if(son == x)
			return;

		swap(pos[H[son]], pos[H[x]]);
		swap(H[son], H[x]);
		x = son;
	}
}

int main(){
    ifstream f(infile);
	ofstream g(outfile);

	f >> N;

	int j, op;
    FORi(i,1,N){
		f >> op;

		switch(op){
		case 1:{
			f >> val[i];
			push(i);
			}break;

		case 2:{
			f >> j;
			erase(pos[j]);
		}break;

	    case 3:{
			g << val[H[1]] << '\n';
			}
		}
	}

    f.close();
	g.close();

    return 0;
}