Pagini recente » Cod sursa (job #1391009) | Cod sursa (job #2631643) | Cod sursa (job #1281772) | Cod sursa (job #2178259) | Cod sursa (job #2493115)
#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[c], 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
/// elementul de la finalul heapului a ajuns mai sus in heap
/// trebuie sa vad daca il duc in sus sau in jos
/// mai intai, presupun ca il duc in jos
p = invpoz[x];
c = 2*p;
if(val[poz[c+1]] < val[poz[c]] && c+1 <= n)
c++;
if(val[poz[p]] > val[poz[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++;
}
}
else{ /// incerc acum sa il duc in sus
c = invpoz[x];
p = c/2;
while(val[poz[c]] < val[poz[p]] && p != 0){
A = poz[c], B = poz[p];
swap(poz[c], poz[p]);
swap(invpoz[A], invpoz[B]);
c = p;
p /= 2;
}
}
}
if(op == 3){
fout<<val[poz[1]]<<"\n";
}
}
return 0;
}