Practice problems from Leetcode: first five hard ones, another five hard ones starting with #1000, and one more.
This last one, #2003, was barely accepted because my solution was O(N log N) while there was a linear one possible, but it actually contains implementations of some cool tree algorithms based on binary lifting: finding the k-th ancestor and finding the LCA in logarithmic time (with O(N log N) preprocessing).