/* 分别对奇数点和偶数点各求一次,首先每个点连两条单向边 1.建立一个源点s,和所有偶数点连边,一次bfs出来的是所有奇数点的答案 2.建立一个源点t,和所有奇数点连边,一次bfs出来的是所有偶数点的答案 */ #include<bits/stdc++.h> #include<vector> using namespace std; #define N 400005 int n,a[N],dis[N],ans[N]; vector<int>G[N],G1[N],G2[N]; queue<int>q; void add(int u,int v){G[u].push_back(v);} void add1(int u,int v){G1[u].push_back(v);} void add2(int u,int v){G2[u].push_back(v);} int main(){ cin>>n; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++){ if(i-a[i]>0)add(i-a[i],i); if(i+a[i]<=n)add(i+a[i],i); } //求奇数点答案 for(int i=1;i<=n;i++)G1[i]=G[i]; for(int i=1;i<=n;i++) if(a[i]%2==0)add1(n+1,i); memset(dis,0,sizeof dis); /*debug for(int i=1;i<=n;i++){ for(auto x:G1[i])cout<<x<<" "; puts(""); }*/ q.push(n+1); while(q.size()){ int now=q.front();q.pop(); for(auto x:G1[now])if(!dis[x]){ dis[x]=dis[now]+1; q.push(x); } } for(int i=1;i<=n;i++) if(a[i]%2)ans[i]=dis[i]-1; //求偶数点答案 while(q.size())q.pop(); for(int i=1;i<=n;i++) G2[i]=G[i]; for(int i=1;i<=n;i++) if(a[i]%2)add2(n+1,i); memset(dis,0,sizeof dis); q.push(n+1); while(q.size()){ int now=q.front();q.pop(); for(auto x:G2[now])if(!dis[x]){ dis[x]=dis[now]+1; q.push(x); } } for(int i=1;i<=n;i++) if(a[i]%2==0)ans[i]=dis[i]-1; for(int i=1;i<=n;i++) cout<<ans[i]<<" "; puts(""); }