Pagini recente » Cod sursa (job #325790) | Cod sursa (job #2553221) | Cod sursa (job #721526) | Cod sursa (job #1966653) | Cod sursa (job #771113)
Cod sursa(job #771113)
#include <fstream>
using namespace std;
int H[200010]; //H[i] = indicele elementului intrat in heap al H[i] - lea si valoarea lui este V[H[i]]
int P[200010]; //P[i] = indicele din heap al alementului adaugat al i - lea in multime
int V[200010];
int N, t, m, nr, x, aux, pc, p, c;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int main() {
f>>N;
for (;N;N--) {
f>>t;
if (t==3) {
g<<V[H[1]]<<"\n";
} else if (t==1) {
f>>V[++nr];
//inserez pe x in heap;
m++;
P[nr] = m;
H[m] = nr;
c = m;
p = c/2;
while (p>=1 && V[H[c]] < V[H[p]]) {
aux = H[c];
H[c] = H[p];
H[p] = aux;
P[ H[c] ] = c;
P[ H[p] ] = p;
c = p;
p = p/2;
}
} else {
f>>x;
//sterg elementul intrat al x - lea in multime. El este in heap pe pozitia P[x]
//1 inlocuiesc acest element cu ultimul si numarul de elemente din heap va scadea cu 1
H[P[x]] = H[m--];
// sunt 2 posibilitati: fie elementul adus in acest loc este mai mic ca tatal lui
pc = P[x];
if (pc/2 !=0 && V[H[pc]]<V[H[pc/2]]) {
//urc elementul
c = pc;
p = c/2;
while (p!=0 && V[H[c]]<V[H[p]]) {
aux = H[c];
H[c] = H[p];
H[p] = aux;
P[H[c]] = c;
P[H[p]] = p;
c = p;
p = p/2;
}
} else {
//cobor elementul
p = pc;
c = 2*p;
while (c <= m) {
if (c+1<=m && V[H[c+1]]<V[H[c]])
c++;
if (V[H[p]] > V[H[c]]) {
aux = H[p];
H[p] = H[c];
H[c] = aux;
P[H[c]] = c;
P[H[p]] = p;
p = c;
c = 2*c;
} else
break;
}
}
}
}
return 0;
}