Pagini recente » Cod sursa (job #2967587) | Cod sursa (job #778920) | Cod sursa (job #2110752) | Cod sursa (job #1030995) | Cod sursa (job #2056035)
#include <bits/stdc++.h>
using namespace std;
/* struct Node {
int data;
Node *pred, *next;
}; */
FILE *f=fopen("heapuri.in","r");
FILE *g=fopen("heapuri.out","w");
const int Nmax = 200001;
int N;
int n,k;
int v[Nmax],cine[Nmax],unde[Nmax];
/// insert x
/// find max (find top)
/// delete top (pop)
/// pentru nodul aflat la pozitia i ai fii (2*i) si (2*i+1)
/// UP HEAP
/// DOWN HEAP
void superswap(int idx, int idy) {
swap(unde[cine[idx]], unde[cine[idy]]);
swap(cine[idx], cine[idy]);
swap(v[idx], v[idy]);
/// swap unde[cine[idx]] unde[cine[idy]]
/// swap cine[idx] cine[idy]
}
void upheap(int index) {
if(index > 1 && v[index] < v[index/2]) {
superswap(index, index/2);
upheap(index/2);
}
}
void downheap(int index) {
if(2*index+1 <= N && v[2*index+1] < v[index] && v[2*index+1] <= v[2*index]) {
superswap(2*index+1, index);
downheap(2*index+1);
}
if(2*index <= N && v[2*index] < v[index]) {
superswap(2*index, index);
downheap(2*index);
}
}
void ins(int x) {
v[++N] = x;
unde[++k] = N;
cine[N] = k;
upheap(N);
}
void popx(int idx) {
int p = unde[idx];
superswap(p, N);
N--;
downheap(p);
}
void pop() {
popx(cine[1]);
}
int top() {
return v[1];
}
int main() {
fscanf(f,"%d",&n);
while(n)
{
int x,y;
fscanf(f,"%d",&x);
if(x==3)
fprintf(g,"%d\n",top());
else
{
fscanf(f,"%d",&y);
if(x==1)
ins(y);
if(x==2)
popx(y);
}
n--;
}
cout<<'\n';
return 0;
}