#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;
}