//这道题大概意思是有一个电梯,有n层,第i层有一个数a[i],可以到达(i-a[i])层或者(i+a[i])层,你
//在qd层要到zd层,问最快需要按几次电梯。这道题思路比较简单,就一个宽搜BFS,从起点开始,往上和往下
//两个方向搜,不是zd层则两个结果压入队列,再从队列中取一个往上往下搜,直到搜到zd层或者队列为空无
//结果。
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define MAX 201
int main(){
int n,qd,zd;
while(scanf("%d", &n)&&n!=0){
//printf("运行1\n");
scanf("%d%d",&qd,&zd);
int a[MAX];
for(int i=1;i<n+1;i++) scanf("%d",&a[i]);
int visit[MAX],queue[MAX],rear=0,front=0,w,i=0,pd=0;//这里visit[MAX]非零则表示已访问,并记录迭代次数
memset( visit, 0, sizeof(visit));
if(qd==zd){printf("0\n");continue;}
visit[qd]=1;//置已访问标记
rear=(rear+1)%MAX;
queue[rear]=qd;//起点进队
while(front!=rear)//若队列不空时循环
{
front=(front+1)%MAX;
w=queue[front];//出队并赋给w
//printf("%d出队\n",w);
if(w==zd){printf("%d\n",visit[w]-1);pd=1;break;}
else
{
if((w-a[w]>0))
{
int j=w-a[w];
//printf("j=%d\n",j);
if((visit[j]==0))
{
visit[j]=visit[w]+1;
rear=(rear+1)%n;
queue[rear]=j;
//printf("%d进队\n",j);
}
}
if((w+a[w]<=n))
{
int j=w+a[w];
//printf("j=%d\n",j);
if((visit[j]==0))
{
visit[j]=visit[w]+1;
rear=(rear+1)%n;
queue[rear]=j;
//printf("%d进队\n",j);
}
}
}
}
if(pd==0) printf("-1\n");
}
return 0;
}