Pagini recente » Cod sursa (job #1656825) | Cod sursa (job #704470) | Cod sursa (job #891190) | Cod sursa (job #1948212) | Cod sursa (job #2890635)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
const int dim = 200003;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
vector<int> heap(dim); //in heap retin pozitiile din v alea valorilor coresp.
vector<int> v(dim); //in v retin valorile
vector<int> pozitii(dim); //in pozitii retin pozitia in heap
int vi, hi, pi;
void Swap(int p1, int p2) {
//schimb poz in heap
int aux = heap[p1];
heap[p1] = heap[p2];
heap[p2] = aux;
pozitii[ heap[p1] ] = p1;
pozitii[ heap[p2] ] = p2;
}
void goUp(int poz) {
while( v[ heap[poz] ] < v[ heap[poz / 2] ] ) {
Swap(poz, poz / 2);
poz /= 2;
}
}
void goDown(int poz) {
int son;
do {
son = 0;
if( poz * 2 <= hi ) {
son = poz * 2;
if( poz * 2 + 1 <= hi && v[heap[poz*2 + 1]] < v[heap[son]] )
son = poz * 2 + 1;
if( v[heap[son]] >= v[heap[poz]] )
son = 0;
}
if( son ) {
Swap(son, poz);
poz = son;
}
}while( son );
}
int main() {
int n, op, val;
fin >> n;
for(int k = 0; k < n; k++) {
fin >> op;
if( op < 3 ) fin >> val;
if( op == 1 ) {
//inserare
v[++vi] = val;
heap[++hi] = vi;
pozitii[vi] = vi;
goUp(hi);
} else if( op == 2 ) {
//stergere
heap[pozitii[val]] = heap[hi--];
pozitii[heap[pozitii[val]]] = pozitii[val];
if( v[ heap[pozitii[val]] ] < v[ heap[ pozitii[val] / 2 ] ] )
goUp( pozitii[val] );
else
goDown( pozitii[val] );
} else {
cout << v[ heap[1] ] << '\n';
}
}
return 0;
}