Pagini recente » Cod sursa (job #2828995) | Cod sursa (job #2275683) | Cod sursa (job #634570) | Cod sursa (job #1346836) | Cod sursa (job #516112)
Cod sursa(job #516112)
# include <fstream>
# define BIG 2000000000
using namespace std;
int n, nr, elem, v[200100], H[200100], hip[200100], POZ[200100];
inline int dad (int son){
return son >> 1;
}
inline int son1 (int dad){
return dad << 1;
}
inline int son2 (int dad){
return (dad << 1) + 1;
}
inline void schimba (int &a, int &b){
int x = a;
a = b;
b = x;
}
void insertHEAP (int elem){
hip[++hip[0]] = elem;//pui elementul la sfarsitul heapului
int poz = hip[0];
H[v[0]] = hip[0];//al i-lea elem inserat e pe poz hip[0]
POZ[hip[0]] = v[0];//elem de pe poz hip[0] e al i-lea inserat;
for (; ; ){
int tata = dad (poz);
if (hip[tata] > hip[poz] && tata > 0){
schimba (hip[tata], hip[poz]);
schimba (H[tata], H[v[0]]);
schimba (POZ[tata], POZ[poz]);
schimba (tata, poz);
}
else break ;
}
}
void removeHEAP (int elem){
int poz = H[elem];//pozitia elementului intrat al elem-lea
hip[poz] = BIG;
for (; ; ){
int fiu1 = son1 (poz), fiu2 = son2 (poz);
if ( (hip[fiu1] < hip[fiu2] || fiu2 > hip[0]) && fiu1 <= hip[0] ){
schimba (hip[fiu1], hip[poz]);
schimba (H[elem], H[POZ[fiu1]]);
schimba (POZ[poz], POZ[fiu1]);
schimba (poz, fiu1);
}
else
if (hip[fiu1] > hip[fiu2]){
schimba (hip[fiu2], hip[poz]);
schimba (H[elem], H[POZ[fiu2]]);
schimba (POZ[poz], POZ[fiu2]);
schimba (poz, fiu2);
}
else break ;
}
}
int main (){
ifstream f ("heapuri.in");
ofstream g ("heapuri.out");
for (f >> n; n > 0; --n){
f >> nr;
if (nr == 1){
f >> elem;
v[++v[0]] = elem;
insertHEAP (elem);
}
else
if (nr == 2){
f >> elem;
removeHEAP (elem);
}
else g << hip[1] << '\n';;
}
g.close ();
return 0;
}