The following should work for you. There's a data structure called a range map which would be more efficient than a BTreeMap, but this should get you going.
type Time = u32;
type MyMap<T> = HashMap<u32, BTreeMap<Time, Option<Rc<T>>>>;
fn operation_3_1<T>(map: &MyMap<T>, k: u32, i: Time) -> Option<&Rc<T>> {
map.get(&k).and_then(|btree| btree.range(i..).next_back().and_then(|e| e.1.as_ref()))
}
Hopefully you can see how to write insert and operation_3_2 yourself.
To help your search, the formal computer science term for this is a "persistent data structure." (This is a different use of the word 'persistent' from e.g. saving something in a database.) There are a few crates that provide persistent data structures in rust, but I don't have experience with them so I can't recommend one over the others.