vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> s;
const int N =1e5;
vector<int> ans;
vector<int> v(N);
int n=nums2.size();
s.push(nums2[n-1]);
v[nums2[n-1]]=-1;
for(int i=nums2.size()-2;i>=0;--i)
{
if(nums2[i]<(s.top()))
{
v[nums2[i]]=s.top();
s.push(nums2[i]);
}
else
{
while(!s.empty() && s.top()<nums2[i] )//order matters in &&
s.pop();
if(s.empty())
v[nums2[i]]=-1;
else
v[nums2[i]]=s.top();
s.push(nums2[i]);
}
}
for(int j=0;j<nums1.size();++j)
{
ans.push_back(v[nums1[j]]);
}
return ans;
}