Pagini recente » Cod sursa (job #1120760) | Cod sursa (job #1433709) | Cod sursa (job #1013218) | Cod sursa (job #601942) | Cod sursa (job #823589)
Cod sursa(job #823589)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 100001
int n, m ;
int heap[maxn] ;
int poz[maxn] ;
int nrheap, nr ;
int v[maxn] ;
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 p)
{
int fiust = 2 * p ;
int fiudr = 2 * p + 1 ;
int pmin = p ;
if( fiust <= nrheap && v[ heap[fiust] ] < v[ heap[pmin] ] )
pmin = fiust ;
if( fiudr <= nrheap && v[ heap[fiudr] ] < v[ heap[pmin] ] )
pmin = fiudr ;
if( p != pmin )
{
schimba( p , pmin ) ;
coboara ( pmin ) ;
}
}
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-- ) ;
coboara ( aux ) ;
}
}
return 0;
}