class MedianFinder {
vector<int> nums;
public:
void addNum(int num) {
nums.push_back(num);
}
double findMedian() {
sort(nums.begin(), nums.end());
int n = nums.size();
int mid = n >> 1;
if (n % 2 == 1) return nums[mid];
return ((double)nums[mid - 1] + nums[mid]) / 2;
}
};
class MedianFinder {
private List<Integer> nums = new ArrayList<>();
public void addNum(int num) {
nums.add(num);
}
public double findMedian() {
Collections.sort(nums);
int n = nums.size();
int mid = n >> 1;
if (n % 2 == 1) return nums.get(mid);
return ((double) nums.get(mid - 1) + nums.get(mid)) / 2;
}
}
class MedianFinder:
def __init__(self):
self.nums = []
def add_num(self, num):
self.nums.append(num)
def find_median(self):
self.nums.sort()
n = len(self.nums)
mid = n >> 1
if n % 2 == 1: return self.nums[mid]
return (self.nums[mid - 1] + self.nums[mid]) / 2
class MedianFinder {
private nums: number[] = [];
addNum(num: number): void {
this.nums.push(num);
}
findMedian(): number {
this.nums.sort((a, b) => a - b);
const n = this.nums.length;
const mid = n >> 1;
if (n % 2 === 1) return this.nums[mid];
return (this.nums[mid - 1] + this.nums[mid]) / 2;
}
}
class MedianFinder {
vector<int> nums;
public:
void addNum(int num) {
int lo = 0;
int hi = nums.size();
while (lo < hi) {
int mid = (lo + hi) >> 1;
if (nums[mid] < num) lo = mid + 1;
else hi = mid;
}
nums.insert(nums.begin() + lo, num);
}
double findMedian() {
int n = nums.size();
int mid = n >> 1;
if (n % 2 == 1) return nums[mid];
return ((double)nums[mid - 1] + nums[mid]) / 2;
}
};
class MedianFinder {
private List<Integer> nums = new ArrayList<>();
public void addNum(int num) {
int lo = 0;
int hi = nums.size();
while (lo < hi) {
int mid = (lo + hi) >> 1;
if (nums.get(mid) < num) lo = mid + 1;
else hi = mid;
}
nums.add(lo, num);
}
public double findMedian() {
int n = nums.size();
int mid = n >> 1;
if (n % 2 == 1) return nums.get(mid);
return ((double) nums.get(mid - 1) + nums.get(mid)) / 2;
}
}
class MedianFinder:
def __init__(self):
self.nums = []
def add_num(self, num):
lo = 0
hi = len(self.nums)
while lo < hi:
mid = (lo + hi) >> 1
if self.nums[mid] < num: lo = mid + 1
else: hi = mid
self.nums.insert(lo, num)
def find_median(self):
n = len(self.nums)
mid = n >> 1
if n % 2 == 1: return self.nums[mid]
return (self.nums[mid - 1] + self.nums[mid]) / 2
class MedianFinder {
private nums: number[] = [];
addNum(num: number): void {
let lo = 0;
let hi = this.nums.length;
while (lo < hi) {
const mid = (lo + hi) >> 1;
if (this.nums[mid] < num) lo = mid + 1;
else hi = mid;
}
this.nums.splice(lo, 0, num);
}
findMedian(): number {
const n = this.nums.length;
const mid = n >> 1;
if (n % 2 === 1) return this.nums[mid];
return (this.nums[mid - 1] + this.nums[mid]) / 2;
}
}
class MedianFinder {
priority_queue<int> low;
priority_queue<int, vector<int>, greater<int>> high;
public:
void addNum(int num) {
if (low.empty() || num <= low.top()) low.push(num);
else high.push(num);
if (low.size() > high.size() + 1) { high.push(low.top()); low.pop(); }
else if (high.size() > low.size()) { low.push(high.top()); high.pop(); }
}
double findMedian() {
if (low.size() > high.size()) return low.top();
return ((double)low.top() + high.top()) / 2;
}
};
class MedianFinder {
private PriorityQueue<Integer> low = new PriorityQueue<>(Collections.reverseOrder());
private PriorityQueue<Integer> high = new PriorityQueue<>();
public void addNum(int num) {
if (low.isEmpty() || num <= low.peek()) low.add(num);
else high.add(num);
if (low.size() > high.size() + 1) high.add(low.poll());
else if (high.size() > low.size()) low.add(high.poll());
}
public double findMedian() {
if (low.size() > high.size()) return low.peek();
return ((double) low.peek() + high.peek()) / 2;
}
}
class MedianFinder:
def __init__(self):
self.low = []
self.high = []
def add_num(self, num):
if not self.low or num <= -self.low[0]: heapq.heappush(self.low, -num)
else: heapq.heappush(self.high, num)
if len(self.low) > len(self.high) + 1: heapq.heappush(self.high, -heapq.heappop(self.low))
elif len(self.high) > len(self.low): heapq.heappush(self.low, -heapq.heappop(self.high))
def find_median(self):
if len(self.low) > len(self.high): return -self.low[0]
return (-self.low[0] + self.high[0]) / 2
class MedianFinder {
private low = new Heap<number>((a, b) => a > b);
private high = new Heap<number>((a, b) => a < b);
addNum(num: number): void {
if (this.low.size === 0 || num <= this.low.peek()) this.low.push(num);
else this.high.push(num);
if (this.low.size > this.high.size + 1) this.high.push(this.low.pop());
else if (this.high.size > this.low.size) this.low.push(this.high.pop());
}
findMedian(): number {
if (this.low.size > this.high.size) return this.low.peek();
return (this.low.peek() + this.high.peek()) / 2;
}
}
class Heap<T> {
private a: T[] = [];
constructor(private before: (x: T, y: T) => boolean) {}
get size() { return this.a.length; }
peek(): T { return this.a[0]; }
push(v: T) {
const a = this.a;
a.push(v);
let i = a.length - 1;
while (i > 0) {
const p = (i - 1) >> 1;
if (!this.before(a[i], a[p])) break;
[a[i], a[p]] = [a[p], a[i]];
i = p;
}
}
pop(): T {
const a = this.a;
const top = a[0];
const last = a.pop()!;
if (a.length) {
a[0] = last;
let i = 0;
for (;;) {
let m = i;
const l = 2 * i + 1, r = l + 1;
if (l < a.length && this.before(a[l], a[m])) m = l;
if (r < a.length && this.before(a[r], a[m])) m = r;
if (m === i) break;
[a[i], a[m]] = [a[m], a[i]];
i = m;
}
}
return top;
}
}
class MedianFinder {
priority_queue<int> low;
priority_queue<int, vector<int>, greater<int>> high;
public:
void addNum(int num) {
low.push(num);
high.push(low.top()); low.pop();
if (high.size() > low.size()) { low.push(high.top()); high.pop(); }
}
double findMedian() {
return low.size() > high.size() ? low.top() : ((double)low.top() + high.top()) / 2;
}
};
class MedianFinder {
private PriorityQueue<Integer> low = new PriorityQueue<>(Collections.reverseOrder());
private PriorityQueue<Integer> high = new PriorityQueue<>();
public void addNum(int num) {
low.add(num);
high.add(low.poll());
if (high.size() > low.size()) low.add(high.poll());
}
public double findMedian() {
return low.size() > high.size() ? low.peek() : ((double) low.peek() + high.peek()) / 2;
}
}
class MedianFinder:
def __init__(self):
self.low = []
self.high = []
def add_num(self, num):
heapq.heappush(self.low, -num)
heapq.heappush(self.high, -heapq.heappop(self.low))
if len(self.high) > len(self.low): heapq.heappush(self.low, -heapq.heappop(self.high))
def find_median(self):
return -self.low[0] if len(self.low) > len(self.high) else (-self.low[0] + self.high[0]) / 2
class MedianFinder {
private low = new Heap<number>((a, b) => a > b);
private high = new Heap<number>((a, b) => a < b);
addNum(num: number): void {
this.low.push(num);
this.high.push(this.low.pop());
if (this.high.size > this.low.size) this.low.push(this.high.pop());
}
findMedian(): number {
return this.low.size > this.high.size ? this.low.peek() : (this.low.peek() + this.high.peek()) / 2;
}
}
class Heap<T> {
private a: T[] = [];
constructor(private before: (x: T, y: T) => boolean) {}
get size() { return this.a.length; }
peek(): T { return this.a[0]; }
push(v: T) {
const a = this.a;
a.push(v);
let i = a.length - 1;
while (i > 0) {
const p = (i - 1) >> 1;
if (!this.before(a[i], a[p])) break;
[a[i], a[p]] = [a[p], a[i]];
i = p;
}
}
pop(): T {
const a = this.a;
const top = a[0];
const last = a.pop()!;
if (a.length) {
a[0] = last;
let i = 0;
for (;;) {
let m = i;
const l = 2 * i + 1, r = l + 1;
if (l < a.length && this.before(a[l], a[m])) m = l;
if (r < a.length && this.before(a[r], a[m])) m = r;
if (m === i) break;
[a[i], a[m]] = [a[m], a[i]];
i = m;
}
}
return top;
}
}