#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
#include <queue>
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
int n,a,c,dis[maxn],x;
bool vis[maxn];
struct qnode
{
int v;
int c;
qnode(int _v=0,int _c=0):v(_v),c(_c){}
bool operator<(const qnode &r)const{
return c>r.c;
}
};
struct edge
{
int v,cost;
edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<edge>e[maxn];
void dij()
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++) dis[i]=inf;
priority_queue<qnode>q;
while(!q.empty()) q.pop();
dis[a]=0;
q.push(qnode(a,0));
while(!q.empty())
{
qnode tmp=q.top();
q.pop();
int u=tmp.v;
if(vis[u]) continue;
vis[u]=true;
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i].v;
int cost=e[u][i].cost;
if(!vis[v]&&dis[v]>dis[u]+cost)
dis[v]=dis[u]+cost;
q.push(qnode(v,dis[v]));
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
e[i].clear();
scanf("%d%d",&a,&c);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(i+x<=n) e[i].push_back(edge(i+x,1));
if(i-x>=1) e[i].push_back(edge(i-x,1));
}
dij();
if(dis[c]<inf)
printf("%d\n",dis[c]);
else
printf("-1\n");
}
return 0;
}