Taking a shot at giving a high level design.
There are only two reasons why a user's score will change:
- The user performed some action; or,
- A unit of time passed.
The time's interaction results in a linear decay†.
The Algorithm
You are trying to rank users, on the basis of score generated from their contribution to the Actions A, B, and C. Let's start with outlining what the software will do when one of the two causes for score change occurs.
When a user performs an action: Generate the user's scores for the rest of time assuming that user will commit no further action and put them in a queue within the user object. The front of the queue will tell the current score of the user.
When a unit of time passes: Just dequeue the front from its score queue.
The Data Structures
It seems to me that the traditional data structures - Arrays, Trees, Hashmaps - and even the usual augmented data structures - Linked Hashmap, Red Black Tree - will not be sufficient to calculate rank for such a scoring model. You will need to move a level up to get the right data structure for generating rank from this scoring system.
I can imagine a multi-doubly-linked kind of Hashmap. Would look somewhat like this:

So in the diagram above, we have one common storage containing all the user objects. Then we have multiple singly/doubly linked indices into the user storage. This way all the indices associated with the user object will be updatable, when user's score changes.
Finally, the ranking can be allowed to not necessarily begin from 1. The sorted-concurrent-hashmap can be updated and could hold negative ranks. Since the map is sorted, the most negative rank will be the first rank and further ranks can be obtained by sorted map's traversal. The ranks can be normalized back to start with some high positive number when the minimum rank gets close to the underflow limit.
This is a pretty big problem. There are many more ideas and optimizations that I have in mind. It is too big a task to mention all of them here. If you have a specific question, I can try to answer that.
†The time's interaction results in a linear decay. So I assume that the calculating the time decaying score from user's current score to next (let's say) 100 scores is simple. How many future scores need to be calculated will depend on what you consider to be one unit of time.