Pagini recente » Cod sursa (job #225577) | Cod sursa (job #284780) | Cod sursa (job #2357175) | Cod sursa (job #2914840) | Cod sursa (job #823573)
Cod sursa(job #823573)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define maxn 100001
int n, m ;
int heap[maxn] ;
int poz[maxn] ;
int nrheap, nr ;
int v[maxn] ;
int fiu_stanga(int unde)
{
return 2 * unde ;
}
int fiu_dreapta(int unde)
{
return 2 * unde + 1 ;
}
int tata(int unde)
{
return unde / 2 ;
}
void schimba(int a, int b)
{
swap ( heap[a], heap[b] ) ;
poz[ heap[a] ] = a ;
poz[ heap[b] ] = b ;
}
void urca(int unde)
{
int sus = tata( unde ) ;
while( unde > 1 && v[ heap[unde] ] < v[ heap[sus] ] )
{
schimba( unde, sus ) ;
unde /= 2 ;
}
}
void coboara(int unde)
{
int fiust = fiu_stanga( unde ) ;
int fiudr = fiu_dreapta( unde ) ;
int ajunge = unde ;
if( fiust <= nrheap && v[ heap[fiust] ] < v[ heap[ajunge] ] )
ajunge = fiust ;
if( fiudr <= nrheap && v[ heap[fiudr] ] < v[ heap[ajunge] ] )
ajunge = fiudr ;
if( unde != ajunge )
{
schimba( unde, ajunge ) ;
coboara( ajunge ) ;
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; ++i )
{
int op ;
scanf("%d",&op);
if( op == 3 )
{
printf("%d\n", v[ heap[1] ] );
continue ;
}
int x ;
scanf("%d", &x);
if( op == 1 )
{
v[++nr] = x ;
heap[++nrheap] = nr ;
poz[nr] = nrheap ;
urca(nrheap) ;
}
else
{
int aux = poz[x] ;
schimba( poz[x], nrheap ) ;
--nrheap ;
coboara(aux) ;
}
}
return 0;
}