package main
import "math/rand"
//leetcode submit region begin(Prohibit modification and deletion)
type Solution struct {nums,original []int
}
func Constructor(nums []int) Solution {return Solution{nums,append([]int(nil),nums...)}
}
func (this *Solution) Reset() []int {copy(this.nums,this.original)
return this.nums
}
func (this *Solution) Shuffle() []int {n:=len(this.nums)
for i:=range this.nums{j:=i+rand.Intn(n-i)
this.nums[i], this.nums[j] = this.nums[j], this.nums[i]
}
return this.nums
}
/**
* Your Solution object will be instantiated and called as such:
* obj := Constructor(nums);
* param_1 := obj.Reset();
* param_2 := obj.Shuffle();
*/
//leetcode submit region end(Prohibit modification and deletion)
type MinStack struct {stack []int
minStack []int}
func Constructor() MinStack {
return MinStack{[]int{},
[]int{math.MaxInt64},
}
}
func (this *MinStack) Push(x int) {this.stack = append(this.stack, x)
top := this.minStack[len(this.minStack)-1]
this.minStack = append(this.minStack, min(x, top))
}
func (this *MinStack) Pop() {this.stack = this.stack[:len(this.stack)-1]
this.minStack = this.minStack[:len(this.minStack)-1]
}
func (this *MinStack) Top() int {return this.stack[len(this.stack)-1]
}
func (this *MinStack) GetMin() int {return this.minStack[len(this.minStack)-1]
}
func min(x, y int) int {
if x < y {return x}
return y
}