Pagini recente » Cod sursa (job #1562597) | Cod sursa (job #1561218) | Cod sursa (job #750467) | Cod sursa (job #957757) | Cod sursa (job #2493100)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, a, A, B, op, val[200001], poz[200001], invpoz[200001], p, c, x, m;
int main(){
fin>>m;
while(m--){
fin>>op;
if(op == 1){ /// se insereaza elementul x in multime
fin>>x;
val[++a] = x; /// valoarea elementului adaugat al a-lea
poz[++n] = a; /// pentru elementul aflat pe pozitia n din heap, aflu ce pozitie are el in sirul numerelor adaugate
invpoz[a] = n; /// pozitia pe care se afla in heap elementul adaugat al a-lea
/// INVPOZ ESTE HEAPUL!!!
c = n;
p = c/2;
/// pun elementul nou x la finalul heapului si vad daca trebuie dus mai sus
while(p != 0 && val[poz[c]] < val[poz[p]]){
A = poz[c], B = poz[p];
swap(poz[invpoz[poz[c]]], poz[invpoz[poz[p]]]);
swap(invpoz[A], invpoz[B]);
c = p;
p /= 2;
}
}
if(op == 2){ /// se sterge elementul intrat al x-lea in multime
fin>>x;
/// il duc la finalul heapului
poz[invpoz[x]] = poz[n];
invpoz[poz[n]] = invpoz[x];
n--; /// stergerea
/// apoi repar stricaciunile
p = 1;
c = 2;
if(val[poz[3]] < val[poz[2]] && 3 <= n)
c++;
while(val[poz[p]] > val[poz[c]] && c <= n){
A = poz[c], B = poz[p];
swap(poz[c], poz[p]);
swap(invpoz[A], invpoz[B]);
p = c;
c *= 2;
if(val[poz[c+1]] < val[poz[c]] && c+1 <= n)
c++;
}
}
if(op == 3)
fout<<val[poz[1]]<<"\n";
}
return 0;
}