// ── ABOUT ────────────────────────────────────────────────────────
// Max heap by default → top() always gives largest
// insert  O(log n)
// delete  O(log n)  → can only delete top()
// top     O(1)
 
// ── MAX HEAP (default) ───────────────────────────────────────────
priority_queue<int> pq;                  // max heap
pq.push(2);
pq.push(1);
pq.push(3);
pq.push(3);
 
cout << pq.top();                        // 3
pq.pop();
cout << pq.top();                        // 3 (duplicate)
 
// ── MIN HEAP ─────────────────────────────────────────────────────
priority_queue<int, vector<int>, greater<int>> pqm;  // min heap
pqm.push(2);
pqm.push(1);
pqm.push(3);
 
cout << pqm.top();                       // 1
 
// ── DRAIN ────────────────────────────────────────────────────────
cout << "size: " << pqm.size();          // O(1)
while (!pqm.empty()) {
    cout << pqm.top() << " ";            // 1 2 3
    pqm.pop();
}
 
// ── MIN HEAP TRICK (when you only have max heap) ──────────────────
// push negative values → negate when reading
pq.push(-arr[i]);
int val = -pq.top();