-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path34.heap.cpp
More file actions
67 lines (65 loc) · 1.04 KB
/
Copy path34.heap.cpp
File metadata and controls
67 lines (65 loc) · 1.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int h[N], hp[N], ph[N];
int mysize;
void heap_swap(int u, int v){
swap(h[u], h[v]);
swap(hp[u], hp[v]);
swap(ph[hp[u]], ph[hp[v]]);
}
void down(int u){
int t = u;
if(2 * u <= mysize && h[t] > h[2 * u]) t = 2 * u;
if(2 * u + 1 <= mysize && h[t] > h[2 * u + 1]) t = 2 * u + 1;
if(u != t){
heap_swap(u, t);
down(t);
}
}
void up(int u){
if(u / 2 > 0 && h[u] < h[u / 2]){
heap_swap(u, u / 2);
up(u >> 1);
}
}
int main()
{
int n; cin >> n;
int m = 0;
while(n--){
string op;
int k, x;
cin >> op;
if(op == "I"){
cin >> x;
m++;
h[++mysize] = x;
ph[m] = mysize;
hp[mysize] = m;
up(mysize);
}
else if(op == "PM") cout << h[1] << endl;
else if(op == "DM"){
heap_swap(1, mysize);
mysize--;
down(1);
}
else if(op == "D"){
cin >> k;
int u = ph[k];
heap_swap(u, mysize);
mysize--;
up(u);
down(u);
}
else if(op == "C"){
cin >> k >> x;
h[ph[k]] = x;
down(ph[k]);
up(ph[k]);
}
}
return 0;
}