Pagini recente » Cod sursa (job #411552) | Cod sursa (job #1574375) | Cod sursa (job #2152991) | Cod sursa (job #371362) | Cod sursa (job #2561392)
#include <fstream>
#include <iostream>
#include <vector>
#define maxn 200010
using namespace std;
int N, L, NR;
vector <int> A (maxn , 0);
vector <int> Heap (maxn , 0);
vector <int> Pos (maxn , 0);
void push(int x){
int aux;
while (x/2 && A[Heap[x]]<A[Heap[x/2]]){
aux = Heap[x];
Heap[x] = Heap[x/2];
Heap[x/2] = aux;
Pos[Heap[x]] = x;
Pos[Heap[x/2]] = x/2;
x /= 2;
}
}
void pop(int x){
int aux, y = 0;
while (x != y){
y = x;
if (y*2<=L && A[Heap[x]]>A[Heap[y*2]])
x = y*2;
if (y*2+1<=L && A[Heap[x]]>A[Heap[y*2+1]])
x = y*2+1;
aux = Heap[x];
Heap[x] = Heap[y];
Heap[y] = aux;
Pos[Heap[x]] = x;
Pos[Heap[y]] = y;
}
}
ifstream fin;
ofstream fout;
int main(){
int i, x, cod;
fin.open("heapuri.in");
fout.open("heapuri.out");
fin>>N;
for (i=1; i<=N; i++) {
fin>>cod;
switch (cod){
case 1:
fin>>x;
L++, NR++;
A[NR] = x;
Heap[L] = NR;
Pos[NR] = L;
push(L);
break;
case 2:
fin>>x;
A[x] = -1;
push(Pos[x]);
Pos[Heap[1]] = 0;
Heap[1] = Heap[L--];
Pos[Heap[1]] = 1;
if (L>1)
pop(1);
break;
case 3:
fout<<A[Heap[1]]<<"\n";
break;
}
}
fin.close();
fout.close();
return 0;
}