1.直接存储某点左右两边最大值最小值
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
const int N = 1e5+5;
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)
int n;
int a[N];
int MAX[N];//从左开始到当前位置的最大值
int MIN[N];//从右开始到当前位置的最小值
vector<int>ans;//the ans
int main(){
int i;
cin>>n;
for(i=1;i<=n;i++)scanf("%d",&a[i]);
MAX[1]=a[1];
MIN[n]=a[n];
for(i=2;i<=n;i++)MAX[i]=max(MAX[i-1],a[i]);
for(i=n-1;i>0;i--)MIN[i]=min(MIN[i+1],a[i]);
for(i=1;i<=n;i++)
if(a[i]>=MAX[i]&&a[i]<=MIN[i])
ans.push_back(a[i]);
sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
if(ans.size() > 0) printf("%d",ans[0]);
for(i=1;i<ans.size();i++)printf(" %d",ans[i]);
printf("\n");
return 0;
}