#3885
Medium Algorithms Design event manager
51.0% acceptance
Mar 31, 2026
56
5
You are given an initial list of events, where each event has a unique eventId and a priority.
Implement the EventManager class:
EventManager(int[][] events) Initializes the manager with the given events, where events[i] = [eventIdi, priorityi].
void updatePriority(int eventId, int newPriority) Updates the priority of the active event with id eventId to newPriority.
int pollHighest() Removes and returns the eventId of the active event with the highest priority. If multiple active events have the same priority, return the smallest eventId among them. If there are no active events, return -1.
An event is called active if it has not been removed by pollHighest().
Solution
Rust
Time O(n log n)
Space O(n)
use std::collections::BTreeSet;
use std::collections::HashMap;
use std::cell::RefCell;
struct EventManager {
set: RefCell<BTreeSet<(i32, i32)>>, // (-priority, eventId)
priorities: RefCell<HashMap<i32, i32>>, // eventId -> priority
}
impl EventManager {
fn new(events: Vec<Vec<i32>>) -> Self {
let mut set = BTreeSet::new();
let mut priorities = HashMap::new();
for e in &events {
let id = e[0];
let pri = e[1];
set.insert((-pri, id));
priorities.insert(id, pri);
}
EventManager {
set: RefCell::new(set),
priorities: RefCell::new(priorities),
}
}
fn update_priority(&self, event_id: i32, new_priority: i32) {
let mut set = self.set.borrow_mut();
let mut priorities = self.priorities.borrow_mut();
if let Some(&old_pri) = priorities.get(&event_id) {
set.remove(&(-old_pri, event_id));
}
set.insert((-new_priority, event_id));
priorities.insert(event_id, new_priority);
}
fn poll_highest(&self) -> i32 {
let mut set = self.set.borrow_mut();
let mut priorities = self.priorities.borrow_mut();
if let Some(&entry) = set.iter().next() {
set.remove(&entry);
priorities.remove(&entry.1);
entry.1
} else {
-1
}
}
}
// Your EventManager object will be instantiated and called as such:
// let obj = EventManager::new(events);
// obj.update_priority(eventId, newPriority);
// let ret_2: i32 = obj.poll_highest();