Cod sursa(job #244520)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 15 ianuarie 2009 12:12:53
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair


typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;

#define IN  "heapuri.in"
#define OUT "heapuri.out"
#define left(x) ((x)<<1)
#define right(x) (left(x)+1)
#define N_MAX 1<<18

int K,N;
int A[N_MAX],P[N_MAX],H[N_MAX];

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d",&K);
	
}

II void down_heap(int nod)
{
	for(;(A[nod] > A[nod<<1] || A[nod] > A[(nod<<1)+1]) && (nod<<1) <= N;)
		if(A[nod<<1] < A[(nod<<1)+1])
		{
			swap(P[ H[nod] ],P[ H[nod<<1] ]);
			swap(H[nod],H[(nod<<1)+1]);
			swap(A[nod],A[nod<<1]);
			nod <<= 1;
		}
		else
		{
			swap(P[ H[nod] ],P[ H[(nod<<1)+1] ]);
			swap(H[nod],H[(nod<<1)+1]);
			swap(A[nod],A[(nod<<1)+1]);
			nod <<= 1;
			++nod;
		}	
}

II void up_heap(int nod)
{
	for(;nod>1 && A[nod] < A[nod>>1];nod >>= 1)
	{
		swap(P[ H[nod] ],P[ H[nod>>1] ]);
		swap(H[nod],H[nod>>1]);
		swap(A[nod],A[nod>>1]);
	}	
}

II void pop_heap(int nod)
{
	A[nod] = A[N];
	--N;
	if(nod>1 && A[nod>>1] > A[nod])
		up_heap(nod);
	else
		down_heap(nod);
}

II void insert_heap(int val)
{
	A[++N] = val;
	P[++P[0]] = N;
	H[N] = P[0];
	up_heap(N);
}

II void solve()
{
	int t,x;
	
	FOR(i,1,K)
	{
		scanf("%d",&t);
		if(t!=3)
			scanf("%d",&x);
		if(t==1)
			insert_heap(x);
		if(t==2)
			pop_heap(P[x]);
		if(t==3)
			printf("%d\n",A[1]);	
	}	
}

int main()
{
	scan();
	solve();
	return 0;
}