I really like data structures, so here I’ll present 2 not really well-known tricks:
1. Have you heard about the problem with queries: add X( \leq 10^{18}) to the set and find the sum of all elements between L and R?
It sounds difficult and one may think about the treaps / C++ ordered sets / implicit segment trees and so on…
But there is an amazing and simple solution with… TRIE!!
Yes, observe that sum(L, R) = sum(0, R) - sum(0, L - 1).
Do you see how the Trie can be used?
2. Everyone knows that segment-tree has depth O(log N) and SQRT-decomposition has the depth = 2, but have you ever thought about hybrid data structure, for example 3-levelsqrtdecomposition, the array divided into N^\frac{1}{3} continuous sub-arrays and each that sub-array is divided into N^\frac{1}{3} continuous sub-arrays. The update will go in O(depth), but the query of sum on sub-segment will processed in O(N^\frac{1}{depth}).
3. Imagine you have the fixed pairing (in scenario of maximal matching). How quickly you can add/remove edges and recalculate the value of the maximal pairing?
For first problem, how are you planning to handle overflow? Maybe add constraints like printing answer modulo 1e9+7 (or some weird modulo of your choice).
Nice practice problem for second idea is SEGPROD. Looking for an explanation? See this answer by owner of this post here
PS: Waiting for your educational rounds.
Also, first problem can be extended to handle delete-if-present queries.