using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG
{
static
void
bfs(
int
n,
int
[] a, List<List<
int
>> invGr,
int
[] ans,
int
parity)
{
Queue<
int
> q =
new
Queue<
int
>();
int
[] vis =
new
int
[n + 1];
int
[] dist =
new
int
[n + 1];
for
(
int
i = 1 ; i <= n ; i++) {
if
(((a[i] + parity) & 1) != 0) {
q.Enqueue(i);
vis[i] = 1;
}
}
while
(q.Count > 0) {
int
v = q.Peek();
q.Dequeue();
foreach
(
int
u
in
invGr[v]) {
if
(vis[u] == 0) {
dist[u] = dist[v] + 1;
vis[u] = 1;
if
((a[u] + parity) % 2 == 0) {
if
(ans[u] == -1){
ans[u] = dist[u];
}
}
q.Enqueue(u);
}
}
}
}
static
void
minJumps(
int
[] a,
int
[] jump,
int
n)
{
List<List<
int
>> invGr =
new
List<List<
int
>>();
for
(
int
i = 0 ; i <= n ; i++)
invGr.Add(
new
List<
int
>());
int
[] ans =
new
int
[n + 1];
for
(
int
i = 0 ; i <= n ; i++){
ans[i] = -1;
}
for
(
int
i = 1 ; i <= n ; i++)
{
if
(i+ jump[i] >= 1 && i+jump[i] <= n) {
invGr[i+ jump[i]].Add(i);
}
if
(i-jump[i] >= 1 && i-jump[i] <= n) {
invGr[i- jump[i]].Add(i);
}
}
bfs(n, a, invGr, ans, 0);
bfs(n, a, invGr, ans, 1);
for
(
int
i = 1 ; i <= n ; i++)
{
Console.Write(ans[i] +
" "
);
}
}
public
static
void
Main(
string
[] args){
int
[] arr =
new
int
[]{ 0, 4, 2, 5, 2, 1 };
int
[] jump =
new
int
[]{ 0, 1, 2, 3, 1, 2 };
int
N = arr.Length;
minJumps(arr, jump, N - 1);
}
}