internal void ExecuteQueries() { foreach (var query in Queries) { var operation = query.Operation; var adder = query.Low; var operand = (query.Low + RunningSum) % M; var high = query.High; var highRange = (high + RunningSum) % M; if (operation != Operations.Sum) { highRange = 0; } switch (operation) { case Operations.Add: if (!TreeNodes.Any() || Root == null) { TreeNodes.Add(new TreeNode(operand)); Root = TreeNodes[0]; UpdateSum(Root); break; } SplayInsert(operand, Root); break; case Operations.Find: if (!TreeNodes.Any()) { QueryResults.Add(Results.NotFound); break; } var foundNode = SplayFind(operand, Root); if (foundNode == null || foundNode.Value != operand) { QueryResults.Add(Results.NotFound); break; } QueryResults.Add(Results.Found); break; case Operations.Del: if (!TreeNodes.Any()) { break; } SplayDel(operand); break; case Operations.Sum: if (!TreeNodes.Any()) { QueryResults.Add("0"); break; } var rangeSum = SumRange(operand, highRange); QueryResults.Add(rangeSum.ToString()); RunningSum = rangeSum; break; } } }