Bitwise OR with Next Element

Last Updated : 7 May, 2026

Given an array arr[], modify the array in-place such that each element becomes the bitwise OR of itself and its next element. The last element remains unchanged as it has no next element.

Examples:

Input: arr[] = [10, 11, 1, 2, 3]
Output: 11 11 3 3 3
Explanation:
At index 0, arr[0] or arr[1] = 11
At index 1, arr[1] or arr[2] = 11
At index 2, arr[2] or arr[3] = 3
...
At index 4, no element is left So, it will remain as it is.
The new Array will be [11, 11, 3, 3, 3].

Input: arr[] = [5, 9, 2, 6]
Output: 13 11 6 6
Explanation:
At index 0, arr[0] or arr[1] = 13.
At index 1, arr[1] or arr[2] = 11.
At index 2, arr[2] or arr[3] = 6.
At index 3, no element is left So, it will remain as it is.
The new array will be [13, 11, 6, 6].

[Naive Approach] Using Extra Array - O(n) Time O(n) Space

The idea is to use a temporary array to store arr[i]|arr[i+1] for each index, keep the last element unchanged, and then copy the result back to the original array.

C++
#include <bits/stdc++.h>
using namespace std;

// function for gamewithnumber
vector<int> gameWithNumber(vector<int> &arr)
{
    int n = arr.size();

    // Temporary array to store results
    vector<int> temp(n);

    // Compute OR for adjacent elements
    for (int i = 0; i < n - 1; i++)
    {
        temp[i] = arr[i] | arr[i + 1];
    }

    // Last element remains same
    temp[n - 1] = arr[n - 1];

    // Copy back to original array
    for (int i = 0; i < n; i++)
    {
        arr[i] = temp[i];
    }

    return arr;
}

// Driver Code
int main()
{
    int n = 5;
    vector<int> arr = {10, 11, 1, 2, 3};

    vector<int> result = gameWithNumber(arr);

    for (int i = 0; i < n; i++)
    {
        cout << result[i] << " ";
    }

    return 0;
}
C
#include <stdio.h>

// function for gameWithNumber
void gameWithNumber(int arr[], int n)
{
    // Temporary array to store results
    int temp[n];

    // Compute OR for adjacent elements
    for (int i = 0; i < n - 1; i++)
    {
        temp[i] = arr[i] | arr[i + 1];
    }

    // Last element remains same
    temp[n - 1] = arr[n - 1];

    // Copy back to original array
    for (int i = 0; i < n; i++)
    {
        arr[i] = temp[i];
    }
}

// Driver Code
int main()
{
    int n = 5;
    int arr[] = {10, 11, 1, 2, 3};

    gameWithNumber(arr, n);

    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }

    return 0;
}
Java
import java.util.*;

class GfG {

    // function for gameWithNumber
    public static ArrayList<Integer> gameWithNumber(int[] arr)
    {
        int n = arr.length;

        // Temporary array to store results
        ArrayList<Integer> temp
            = new ArrayList<>(Collections.nCopies(n, 0));

        // Compute OR for adjacent elements
        for (int i = 0; i < n - 1; i++) {
            temp.set(i, arr[i] | arr[i + 1]);
        }

        // Last element remains same
        temp.set(n - 1, arr[n - 1]);

        return temp;
    }

    // Driver Code
    public static void main(String[] args)
    {
        int n = 5;
        int[] arr = { 10, 11, 1, 2, 3 };

        ArrayList<Integer> result = gameWithNumber(arr);

        for (int i = 0; i < n; i++) {
            System.out.print(result.get(i) + " ");
        }
    }
}
Python
# function for gameWithNumber
def gameWithNumber(arr):
    n = len(arr)

    # Temporary array to store results
    temp = [0] * n

    # Compute OR for adjacent elements
    for i in range(n - 1):
        temp[i] = arr[i] | arr[i + 1]

    # Last element remains same
    temp[n - 1] = arr[n - 1]

    # Copy back to original array
    for i in range(n):
        arr[i] = temp[i]

    return arr


# Driver Code
if __name__ == "__main__":
    n = 5
    arr = [10, 11, 1, 2, 3]

    result = gameWithNumber(arr)

    for i in range(n):
        print(result[i], end=" ")
C#
using System;
using System.Collections.Generic;

class GfG {

    // function for gameWithNumber
    public static List<int> gameWithNumber(int[] arr) {
        int n = arr.Length;

        // Temporary list to store results
        List<int> temp = new List<int>(new int[n]);

        // Compute OR for adjacent elements
        for (int i = 0; i < n - 1; i++) {
            temp[i] = arr[i] | arr[i + 1];
        }

        // Last element remains same
        temp[n - 1] = arr[n - 1];

        return temp;
    }

    // Driver Code
    static void Main()
    {
        int n = 5;
        int[] arr = { 10, 11, 1, 2, 3 };

        List<int> result = gameWithNumber(arr);

        for (int i = 0; i < n; i++) {
            Console.Write(result[i] + " ");
        }
    }
}
JavaScript
// function for gameWithNumber
function gameWithNumber(arr)
{
    let n = arr.length;

    // Temporary array to store results
    let temp = new Array(n);

    // Compute OR for adjacent elements
    for (let i = 0; i < n - 1; i++) {
        temp[i] = arr[i] | arr[i + 1];
    }

    // Last element remains same
    temp[n - 1] = arr[n - 1];

    // Copy back to original array
    for (let i = 0; i < n; i++) {
        arr[i] = temp[i];
    }

    return arr;
}

// Driver code
let n = 5;
let arr = [ 10, 11, 1, 2, 3 ];
let result = gameWithNumber(arr);

for (let i = 0; i < n; i++) {
    console.log(result[i]);
}

Output
11 11 3 3 3 

Time Complexity: O(n)
Space Complexity: O(n),extra space used

[Expected Approach] In-Place - O(n) Time O(1) Space

The idea is to traverse the array from left to right and modify the array in-place. Since we traverse from left to right, we do not need the previous value of an updated item, so need of an extra array.

Working of Approach:

  • Traverse from 0 to n-2
  • Update: arr[i] = arr[i] | arr[i+1]
  • Leave last element unchanged
C++
#include <bits/stdc++.h>
using namespace std;

// function for gamewithnumber
vector<int> gameWithNumber(vector<int> &arr)
{
    int n = arr.size();

    // Traverse till second last element
    for (int i = 0; i < n - 1; i++)
    {

        // Replace current element with OR 
        // of itself and next element
        arr[i] = arr[i] | arr[i + 1];
    }

    // Last element remains unchanged
    return arr;
}

// Driver Code
int main()
{
    int n = 5;
    vector<int> arr = {10, 11, 1, 2, 3};

    vector<int> result = gameWithNumber(arr);

    for (int i = 0; i < n; i++)
    {
        cout << result[i] << " ";
    }

    return 0;
}
C
#include <stdio.h>

// function for gamewithnumber
void gameWithNumber(int arr[], int n)
{
    // Traverse till second last element
    for (int i = 0; i < n - 1; i++)
    {

        // Replace current element with OR of itself and next element
        arr[i] = arr[i] | arr[i + 1];
    }
}

// Driver Code
int main()
{
    int n = 5;
    int arr[] = {10, 11, 1, 2, 3};

    gameWithNumber(arr, n);

    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }

    return 0;
}
Java
import java.util.*;

class GfG {

    // function for gamewithnumber
    public static ArrayList<Integer>
    gameWithNumber(int[] arr)
    {
        int n = arr.length;

        // Convert array to ArrayList for in-place updates
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(arr[i]);
        }

        // Traverse till second last element
        for (int i = 0; i < n - 1; i++) {

            // Replace current element with OR of itself and
            // next element
            list.set(i, list.get(i) | list.get(i + 1));
        }

        // Last element remains unchanged
        return list;
    }

    public static void main(String[] args)
    {
        int n = 5;
        int[] arr = { 10, 11, 1, 2, 3 };

        ArrayList<Integer> result = gameWithNumber(arr);

        for (int i = 0; i < n; i++) {
            System.out.print(result.get(i) + " ");
        }
    }
}
Python
# Python implementation of above approach
class Solution:

    # function for gamewithnumber
    def gameWithNumber(self, arr):
        n = len(arr)

        # Traverse till second last element
        for i in range(n - 1):

            # Replace current element with OR of itself and next element
            arr[i] = arr[i] | arr[i + 1]

        # Last element remains unchanged
        return arr


# Driver Code
if __name__ == "__main__":
    n = 5
    arr = [10, 11, 1, 2, 3]

    obj = Solution()
    result = obj.gameWithNumber(arr)

    for i in range(n):
        print(result[i], end=" ")
C#
using System;
using System.Collections.Generic;

class GfG {

    // function for gameWithNumber
    public static List<int> gameWithNumber(int[] arr)
    {
        int n = arr.Length;

        // Temporary list to store results
        List<int> temp = new List<int>(new int[n]);

        // Traverse till second last element
        for (int i = 0; i < n - 1; i++) {

            // Replace current element with OR of itself and next element
            temp[i] = arr[i] | arr[i + 1];
        }

        // Last element remains unchanged
        temp[n - 1] = arr[n - 1];

        return temp;
    }

    static void Main()
    {
        int n = 5;
        int[] arr = { 10, 11, 1, 2, 3 };

        List<int> result = gameWithNumber(arr);

        for (int i = 0; i < n; i++) {
            Console.Write(result[i] + " ");
        }
    }
}
JavaScript
class Solution {

    // function for gamewithnumber
    gameWithNumber(arr)
    {
        let n = arr.length;

        // Traverse till second last element
        for (let i = 0; i < n - 1; i++) {

            // Replace current element with OR of itself and
            // next element
            arr[i] = arr[i] | arr[i + 1];
        }

        // Last element remains unchanged
        return arr;
    }
}

// driver code
let n = 5;
let arr = [ 10, 11, 1, 2, 3 ];

let obj = new Solution();
let result = obj.gameWithNumber(arr);

for (let i = 0; i < n; i++) {
    console.log(result[i] + " ");
}

Output
11 11 3 3 3 

Time Complexity: O(n)
Auxiliary Space: O(1)

Comment