using System.Collections.Generic;
public class StackOfPlates{
private List<Stack<Plate>> plates;
public StackOfPlates(int threshold){
this.threshold = threshold;
this.plates = new List<Stack<Plate>>();
public void Push(Plate plate){
var lastPlatePilePos = plates.Count - 1;
if (lastPlatePilePos == -1 || plates[lastPlatePilePos].Count == threshold){
var newPile = new Stack<Plate>();
if (plates.Count == 0) return null;
var lastPlatePile = plates[plates.Count - 1];
var plate = lastPlatePile.Pop();
if (lastPlatePile.Count == 0) plates.RemoveAt(plates.Count-1);
private void MoveBottomPlate(Stack<Plate> source, Stack<Plate> target){
var temp = new Stack<Plate>();
while(source.Count != 0){
source.Push(target.Pop());
public Plate PopAt(int index){
if (index >= plates.Count) return null;
var pileAtIndex = plates[index];
var plate = pileAtIndex.Pop();
for (var i=index+1; i<plates.Count; i++){
MoveBottomPlate(plates[i], plates[i-1]);
if (plates[plates.Count - 1].Count == 0){
plates.RemoveAt(plates.Count-1);
public static void Main()
Console.WriteLine("Hello World");