#include<bits/stdc++.h>
using namespace std;int a[1000007],b[1000007],c[1000007];int find_max(int lll,int rrr,int lenn){ int maxnn=0; int summ=0; for(int i=lll;i<=rrr;i++){ maxnn=max(maxnn,c[i]); if(maxnn==lenn+i-lll)//这一段可以经过排序满足题意 summ++; } return summ;}int divide(int l,int r){ int num=1; int len=r-l+1; int ll=1; for(int i=l;i<=r;i++){ c[i-l+1]=a[i]-l+1;//对于这一段进行操作,每一段的值都是l到r之间的值,全部减去l-1 } int minn=0; for(int i=1;i<=len;i++){ if(i==1) minn=c[1]; else minn=min(minn,c[i]); if(minn==len+1-i){//这一段可以和另一半交换 if(ll==1&&i==len) continue;//不可交换串 if(ll==1||i==len) num=max(2,num);//至少可以分成两串 else{ int xx=find_max(ll,i,len-i+1);//边上两串交换,中间串尽可能分割 num=max(xx+2,num); } ll=i+1;//下一段的左端点 } } return num;}int main(){ int n,k; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%d%d",&n,&k); int maxn=0; int sum=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); maxn=max(maxn,a[i]); if(maxn==i)//如果最大值和i相等,说明从上一个b[i]+1到i之间的串是可以经过排序满足题意的 b[i]=i,sum++;//如果sum已经达到k了,就无需去交换操作了 } int ans=sum; int flag=1; if(ans>=k) printf("Yes"); else{ for(int i=1;i<=n;i++){ if(b[i]==i){ int x=divide(flag,i)-1;//看看每一段中间经过交换操作能多出几段 ans=max(ans,sum+x); flag=i+1;//下一段的左端点 } } if(ans>=k) printf("Yes"); else printf("Poor Simon"); } return 0;}//通过对一段l到r的串进行构造和思考,可以发现满足题意都是l到r之间值都为l到r之间的//一段想要通过交换得到更多段,需要把中间隔成若干尽可能多的段,两端的段交换,中间的分段,可以使段尽可能的多