/*
Online Java - IDE, Code Editor, Compiler
Online Java is a quick and easy tool that helps you to build, compile, test your programs online.
*/
import java.util.ArrayList;

public class Main
{
    public static void main(String[] args) 
    {
        System.out.println("Welcome to Online IDE!! Happy Coding :)");
        
        int[] nums = new int[]{1,1,12,1,0,3,0,0,1,1,3,0,0,1};
        boolean moveForward=true;
        
        String numbers = java.util.Arrays.toString(nums);
        System.out.println(numbers+"\n");
        boolean [] outcome = new boolean[nums.length];
        int falseCount=0;
        boolean forward;
        boolean flag;
        boolean zeroVerified=false;

        for (int i=0; i<nums.length; i++)
        {
            forward=false;
            flag=true;
            zeroVerified=false;
            
            if (nums[i]>nums.length)
            {
                System.out.println("Index: " + i + " value: " + nums[i]+ " is greater than list size from its position: " + i + " :FAIL");
                falseCount++;
                i++;
            }
            
            if (i+nums[i]>nums.length-1)
            {
                System.out.println("Index: " + i + " value: " + nums[i] + " is greater than list size from its position: " + i + " :FAIL");
                moveForward=false;
                outcome[i]=false;
                falseCount++;
                i++;
            }
            
            moveForward=true;
            
            if(i!=nums.length)
            {
                if (i==nums.length-1)
                {
                    if (nums[i]==0 && forward==true)
                    {
                        System.out.println("Index3: " + (i) + ". No movement forward - 0 value" + " :PASS");
                        zeroVerified=true;
                        break;

                    }
                    if (i!=nums.length-1 && zeroVerified==false)
                    {
                        System.out.println("Index: " + (i) + ". No movement forward - 0 value" + " :FAIL");
                    }
                }
                
                if (i!=nums.length-1)
                {
                    if (nums[i]==0 && forward==true)
                    {
                        System.out.println("Index1: " + i + ". No movement forward - 0 value" + " :PASS");
                        
                        if (i==0)
                        {
                            falseCount++;
                        }
                    }
                }
                
                if (i!=nums.length-1)
                {
                    if (nums[i]==1 && nums[i+1]>0 && i+nums[i]<nums.length)
                    {
                        System.out.println("Index: " + i + " moved forward to index: "+ (i+1) + " :PASS");
                        outcome[i]=true;
                        forward=true;
                    }
                    
                    if (nums[i]==1 && nums[i+1]==0 && i+1!=nums.length-1)
                    {
                        System.out.println("Index: " + i + " moved forward to index: "+ (i+1) + " :PASS");
                        moveForward=false;
                        outcome[i]=false;
                    }
                }

                if (nums[i]==0 && i!=nums.length-1)
                {
                    System.out.println("Index1: " + i + " failed to move forward." + " :FAIL");
                    moveForward=false;
                    outcome[i]=false;
                }
                
                if (nums[i]!=0 && i==nums.length-1)
                {
                    System.out.println("Index: " + i + " incorrect last index value. Should be 0." + " :FAIL");
                    falseCount++;
                    moveForward=false;
                    outcome[i]=false;
                }
                
                for (int j=1;j<nums[i];j++)
                {
                    if (nums[i+j]>0 && nums[i]>0)
                    {
                        System.out.println("Index2: " + i + " failed to move forward" + " :FAIL");
                        moveForward=false;
                        outcome[i]=false;
                        falseCount++;
                        forward=false;
                    }
                    
                    if (i+nums[i]<nums.length)
                    {
                        for (int zeroCheck=1;zeroCheck<nums[i];zeroCheck++)
                        {
                            if (nums[zeroCheck+i]>0)
                            {
                                flag=false;
                            }
                            
                            if (nums[zeroCheck+i]==0)
                            {
                                System.out.println("Index5: " + (i+zeroCheck) + ". No movement forward - 0 value" + " :PASS" );
                            }
                        }
                        
                        if (flag!=false)
                        {
                            System.out.println("Index: " + i + " moved forward to index: "+ (i+nums[i]) + " :PASS");
                        }
                        
                        if (flag==true)
                        {
                            forward=true;
                            outcome[i]=true;
                            System.out.println("Index2: " + (i+j) + ". No movement forward - 0 value" + " :PASS" );
                            j=nums.length;
                        }
                    }
                }
                
                if (nums[nums.length-1]==0)
                {
                    if (nums[i+nums[i]]==0 && i+nums[i]==nums.length-1)
                    {
                        if(moveForward)
                        {
                            System.out.println("Index: " + i + ". This will reach end. Value 0 detected at end" + " :PASS");
                            outcome[i]=true;
                        }
                    }
                }
            }
        }
        
        for (boolean b: outcome)
        {
            if (falseCount==0)
            {
                System.out.println("TRUE");
                break;
            }
            
            if (!b)
            {
                System.out.println("FALSE");
                System.exit(0);
                falseCount++;
            }
        }
    }
}