Pagini recente » Istoria paginii runda/ichbscoala2015clasa7/clasament | Cod sursa (job #676340) | Cod sursa (job #2990800) | Cod sursa (job #1121114) | Cod sursa (job #794680)
Cod sursa(job #794680)
#include <fstream>
using namespace std;
const int N = 200005;
struct Nod{
int val, key;
Nod(){
val = key = 0;
}
Nod(int _val, int _key){
val = _val;
key = _key;
}
inline bool operator< (Nod X){
return key < X.key;
}
};
struct Heap{
Nod H[N];
int index[N], n;
Heap(){
n = 0;
}
void swap(int& a, int& b){
int c = a;
a = b;
b = c;
}
void swap(Nod& a, Nod& b){
Nod c = a;
a = b;
b = c;
}
void sch(int a, int b){
swap(H[a], H[b]);
swap(index[ H[a].val ], index[ H[b].val ]);
}
void up(int poz){
while (poz > 1 && H[poz] < H[poz >> 1]){
sch(poz, poz >> 1);
poz >>= 1;
}
}
void down(int poz){
int m = poz; poz = -1;
while (poz != m){
poz = m;
for (int x = poz << 1 ; x <= (poz << 1) + 1 ; x++)
if (x <= n && H[x] < H[m])
m = x;
if (m != poz)
sch(m, poz);
}
}
void push(Nod x){
H[++n] = x;
index[x.val] = n;
up(n);
}
void pop(int key){
int P = index[key];
if (!P)
return;
sch(P, n--);
up(P);
down(P);
index[key] = 0;
}
inline int top(){
return H[1].key;
}
} H;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int main(){
int t, x, ins = 0;
in >> t;
while (t--){
in >> x;
if (x == 1){
in >> x;
H.push(Nod(++ins, x));
continue;
}
if (x == 2){
in >> x;
H.pop(x);
continue;
}
out << H.top() << "\n";
}
return 0;
}