Ok you have 3 different activation events that you need to filter.
The first is simple. Whenever a player wins which can be referenced by binding a trigger with TriggerRegisterPlayerEvent(trig, whichPlayer, EVENT_PLAYER_VICTORY) or the BJ (for use in GUI) which references it. When a player wins you add them to a force (player group in GUI) and then run the intersection evaluator.
The second just runs the intersection evaluator when a player does anything to reduce lumber.
The other is more complex. If you harvest lumber then you need a perodic event but if lumber is given by triggers you can simply get the triggers which give lumber to run the intersection evaluator (or make your own lumber function which runs it as well for better coding). Remember to only run it when a lumber change is detected.
The intersection evaluator runs through the force of all the players who won. For each one of them it runs it through the standard maximum algorthim. What this means is that it firstly sets an innitial player in a variable (usually local) to a value of null who has a lumber of -1 (negative lumber is not possible as far as I know) stored in another local for efficiency. It then goes through all the players in the force and if that player has a lumber greater than the current player it then updates the current player to him and the max lumber to the lumber he has. Repeat for all players and you will know for sure who has won and has the most lumber. All that is left to do is check if the maximum player is not null (it will be null if no one has won yet) and then run the handler code you want or evaluate the triggers you want to run.
Something tells me you are not describing your problem specification clearly as I doubt the above is what you are after.