#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=1e5+5;
// 邻接表:存储图的边关系
vector<vector<ll>>adj(N);
// 访问标记数组:标记节点是否被遍历过,用于检测环
vector<bool>vis(N,false);
// BFS队列:用于广度优先搜索的节点存储
queue<ll>q;
// BFS核心函数:遍历图并检测是否存在环
void bfs(){
// 步骤1:循环处理队列中的所有节点,直到队列为空
while(!q.empty()){
// 步骤2:取出队首节点(当前遍历的核心节点)
ll t=q.front();
q.pop();
// 步骤3:遍历当前节点的所有邻接节点
for(auto it:adj[t]){
// 步骤4:检测环——若邻接节点已被访问,说明存在环
if(vis[it]==true){
cout<<"Yes"; // 存在环,输出结果并终止函数
return;
}
// 步骤5:未访问过的节点,标记为已访问并加入队列等待遍历
q.push(it);
vis[it]=true;
}
}
// 步骤6:遍历完成未发现环,输出结果
cout<<"No";
}
int main(){
// 优化输入输出速度,适配大数据量场景
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll n,x;
cin>>n>>x; // 输入节点数n和起始遍历节点x
// 步骤7:构建邻接表——读入每个节点的关联关系并存储
for(ll i=1;i<=n;i++){
ll t;
cin>>t;
adj[t].emplace_back(i); // 添加边 t -> i
}
// 步骤8:初始化BFS——起始节点入队,启动遍历
q.push(x);
bfs();
return 0;
}