import java.util.ArrayDeque;
import java.util.Deque;
class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
solution.nextGreaterElements(new int[]{
1,2,1
});
}
public int[] nextGreaterElements(int[] nums) {
Deque<Integer> stack = new ArrayDeque();
int[] ans = new int[nums.length];
int left = 0;
for(int i=nums.length-1;i>=0;i--){
int num = nums[i];
int idx = i;
while(!stack.isEmpty() &&stack.peek() <= num){
stack.pop();
}
if(!stack.isEmpty()){
ans[idx] = stack.peek();
stack.push(num);
continue;
}else{
int x = left;
for(x= left;x< i && nums[x]<=num;x++);
left = x;
if( left < i){
stack.addLast(nums[left]);
ans[idx] = stack.peek();
}else{
ans[idx] = -1;
}
stack.push(num);
}
}
return ans;
}
}