Pagini recente » Cod sursa (job #725805) | Cod sursa (job #835371) | Cod sursa (job #1906771) | Cod sursa (job #1689162) | Cod sursa (job #3273797)
#include <bits/stdc++.h>
using namespace std;
vector< int > h, val, poz;
void sus ( int pos ) {
int aux;
while ( val[ h[pos] ] < val[ h[pos / 2 ] ] && pos != 1 ) {
poz[ h[pos] ] = pos / 2;
poz[ h[pos /2 ] ] = pos;
aux = h[pos];
h[pos] = h[pos / 2];
h[pos/2] = aux;
pos /= 2;
}
}
void jos ( int pos ) {
while ( val[ h[pos] ] > min( h[2 * pos], h[2*pos + 1]) && 2* pos < h.size() - 1 ) {
if ( val[ h[ 2*pos] ]< val[ h[2*pos + 1] ]) {
poz[ h[pos] ] = 2 * pos;
poz[ h[pos * 2] ] = pos;
swap ( h[pos], h[pos * 2]);
pos = 2 * pos;
} else {
poz[ h[pos] ] = 2 * pos + 1;
poz[ h[pos * 2 + 1] ] = pos;
swap ( h[pos], h[pos * 2 + 1]);
pos = 2 * pos + 1;
}
}
if ( 2 * pos == h.size() - 1 && h[pos] > h[ 2*pos] ) {
poz[ h[pos] ] = 2 * pos;
poz[ h[pos * 2] ] = pos;
swap ( h[pos], h[pos * 2]);
}
}
void push ( int value ) {
val.push_back( value );
h.push_back( val.size() - 1 );
poz.push_back( h.size() - 1 );
sus( (int) h.size() - 1 );
}
void pop( int t ) {
poz[ h[h.size() -1] ] = poz[ t ];
h[ poz[t]] = h[ h.size() - 1 ];
h.pop_back();
sus( poz[t] );
jos( poz[t] );
}
int main()
{
val.push_back(0);
h.push_back(0);
poz.push_back(0);
int n, operatie, x, i;
ifstream fin ( "heapuri.in" );
ofstream fout ( "heapuri.out" );
fin >> n;
for ( i = 0; i < n; i ++ ) {
fin >> operatie;
if ( operatie == 1 ) {
fin >> x;
push ( x );
} else if ( operatie == 2 ) {
fin >> x;
pop( x );
} else
fout << val[h[1]] << "\n";
}
fin.close();
fout.close();
return 0;
}