Given an array arr[] of N and Q queries consisting of a range [L, R]. the task is to find the bit-wise AND of all the elements of in that index range.
Examples: 
 
Input: arr[] = {1, 3, 1, 2, 3, 4}, q[] = {{0, 1}, {3, 5}}
Output:
1
0
1 AND 3 = 1
2 AND 3 AND 4 = 0
Input: arr[] = {1, 2, 3, 4, 5}, q[] = {{0, 4}, {1, 3}}
Output:
0
0
Naive approach: Iterate through the range and find bit-wise AND of all the numbers in that range. This will take O(n) time for each query.
Efficient approach: If we look at the integers as binary number, we can easily see that condition for ith bit of our answer to be set is that ith bit of all the integers in the range [L, R] should be set. 
So, we will calculate prefix-count for each bit. We will use this to find the number of integers in the range with ith bit set. If it is equal to the size of the range then the ith bit of our answer will also be set.
Below is the implementation of the above approach: 
 
C++
| // C++ implementation of the approach#include <bits/stdc++.h>#define MAX 100000#define bitscount 32usingnamespacestd;// Array to store bit-wise// prefix countintprefix_count[bitscount][MAX];// Function to find the prefix sumvoidfindPrefixCount(intarr[], intn){    // Loop for each bit    for(inti = 0; i < bitscount; i++) {        // Loop to find prefix count        prefix_count[i][0] = ((arr[0] >> i) & 1);        for(intj = 1; j < n; j++) {            prefix_count[i][j] = ((arr[j] >> i) & 1);            prefix_count[i][j] += prefix_count[i][j - 1];        }    }}// Function to answer queryintrangeAnd(intl, intr){    // To store the answer    intans = 0;    // Loop for each bit    for(inti = 0; i < bitscount; i++) {        // To store the number of variables        // with ith bit set        intx;        if(l == 0)            x = prefix_count[i][r];        else            x = prefix_count[i][r]                - prefix_count[i][l - 1];        // Condition for ith bit        // of answer to be set        if(x == r - l + 1)            ans = (ans | (1 << i));    }    returnans;}// Driver codeintmain(){    intarr[] = { 7, 5, 3, 5, 2, 3 };    intn = sizeof(arr) / sizeof(int);    findPrefixCount(arr, n);    intqueries[][2] = { { 1, 3 }, { 4, 5 } };    intq = sizeof(queries) / sizeof(queries[0]);    for(inti = 0; i < q; i++)        cout << rangeAnd(queries[i][0],                         queries[i][1])             << endl;    return0;} | 
Java
| // Java implementation of the approach importjava.io.*;classGFG {    staticintMAX = 100000;staticintbitscount =32;// Array to store bit-wise// prefix countstaticint[][]prefix_count = newint[bitscount][MAX];// Function to find the prefix sumstaticvoidfindPrefixCount(intarr[], intn){    // Loop for each bit    for(inti = 0; i < bitscount; i++)     {        // Loop to find prefix count        prefix_count[i][0] = ((arr[0] >> i) & 1);        for(intj = 1; j < n; j++)         {            prefix_count[i][j] = ((arr[j] >> i) & 1);            prefix_count[i][j] += prefix_count[i][j - 1];        }    }}// Function to answer querystaticintrangeAnd(intl, intr){    // To store the answer    intans = 0;    // Loop for each bit    for(inti = 0; i < bitscount; i++)     {        // To store the number of variables        // with ith bit set        intx;        if(l == 0)            x = prefix_count[i][r];        else            x = prefix_count[i][r]                - prefix_count[i][l - 1];        // Condition for ith bit        // of answer to be set        if(x == r - l + 1)            ans = (ans | (1<< i));    }    returnans;}// Driver codepublicstaticvoidmain (String[] args) {    intarr[] = { 7, 5, 3, 5, 2, 3};    intn = arr.length;        findPrefixCount(arr, n);        intqueries[][] = { { 1, 3}, { 4, 5} };    intq = queries.length;        for(inti = 0; i < q; i++)                System.out.println (rangeAnd(queries[i][0],queries[i][1]));        }}// This code is contributed by ajit.  | 
Python3
| # Python3 implementation of the approach importnumpy as npMAX=100000bitscount =32# Array to store bit-wise # prefix count prefix_count =np.zeros((bitscount,MAX)); # Function to find the prefix sum deffindPrefixCount(arr, n) :    # Loop for each bit     fori inrange(0, bitscount) :                # Loop to find prefix count         prefix_count[i][0] =((arr[0] >> i) & 1);                 forj inrange(1, n) :            prefix_count[i][j] =((arr[j] >> i) & 1);             prefix_count[i][j] +=prefix_count[i][j -1]; # Function to answer query defrangeOr(l, r) :     # To store the answer     ans =0;     # Loop for each bit     fori inrange(bitscount) :                # To store the number of variables         # with ith bit set         x =0;                 if(l ==0) :            x =prefix_count[i][r];         else:            x =prefix_count[i][r] -prefix_count[i][l -1];                    # Condition for ith bit        # of answer to be set        if(x ==r -l +1) :            ans =(ans | (1<< i));                 returnans; # Driver code if__name__ =="__main__":     arr =[ 7, 5, 3, 5, 2, 3];     n =len(arr);    findPrefixCount(arr, n);     queries =[ [ 1, 3], [ 4, 5] ];         q =len(queries);     fori inrange(q) :        print(rangeOr(queries[i][0], queries[i][1]));# This code is contributed by AnkitRai01 | 
C#
| // C# implementation of the approachusingSystem;classGFG {     staticintMAX = 100000; staticintbitscount =32; // Array to store bit-wise // prefix count staticint[,]prefix_count = newint[bitscount,MAX]; // Function to find the prefix sum staticvoidfindPrefixCount(int[]arr, intn) {     // Loop for each bit     for(inti = 0; i < bitscount; i++)     {         // Loop to find prefix count         prefix_count[i,0] = ((arr[0] >> i) & 1);         for(intj = 1; j < n; j++)         {             prefix_count[i,j] = ((arr[j] >> i) & 1);             prefix_count[i,j] += prefix_count[i,j - 1];         }     } } // Function to answer query staticintrangeAnd(intl, intr) {     // To store the answer     intans = 0;     // Loop for each bit     for(inti = 0; i < bitscount; i++)     {         // To store the number of variables         // with ith bit set         intx;         if(l == 0)             x = prefix_count[i,r];         else            x = prefix_count[i,r]                 - prefix_count[i,l - 1];         // Condition for ith bit         // of answer to be set         if(x == r - l + 1)             ans = (ans | (1 << i));     }     returnans; } // Driver code publicstaticvoidMain (String[] args) {     int[]arr = { 7, 5, 3, 5, 2, 3 };     intn = arr.Length;         findPrefixCount(arr, n);         int[,]queries = { { 1, 3 }, { 4, 5 } };     intq = queries.GetLength(0);         for(inti = 0; i < q; i++)             Console.WriteLine(rangeAnd(queries[i,0],queries[i,1]));         } } // This code contributed by Rajput-Ji | 
Javascript
| <script>        // Javascript implementation of the approach         let MAX = 100000;    let bitscount =32;    // Array to store bit-wise    // prefix count    let prefix_count = newArray(bitscount);        for(let i = 0; i < bitscount; i++)     {        prefix_count[i] = newArray(MAX);        for(let j = 0; j < MAX; j++)        {            prefix_count[i][j] = 0;        }    }    // Function to find the prefix sum    functionfindPrefixCount(arr, n)    {        // Loop for each bit        for(let i = 0; i < bitscount; i++)         {            // Loop to find prefix count            prefix_count[i][0] = ((arr[0] >> i) & 1);            for(let j = 1; j < n; j++)             {                prefix_count[i][j] = ((arr[j] >> i) & 1);                prefix_count[i][j] += prefix_count[i][j - 1];            }        }    }    // Function to answer query    functionrangeAnd(l, r)    {        // To store the answer        let ans = 0;        // Loop for each bit        for(let i = 0; i < bitscount; i++)         {            // To store the number of variables            // with ith bit set            let x;            if(l == 0)                x = prefix_count[i][r];            else                x = prefix_count[i][r]                    - prefix_count[i][l - 1];            // Condition for ith bit            // of answer to be set            if(x == r - l + 1)                ans = (ans | (1 << i));        }        returnans;    }    let arr = [ 7, 5, 3, 5, 2, 3 ];    let n = arr.length;          findPrefixCount(arr, n);          let queries = [ [ 1, 3 ], [ 4, 5 ] ];    let q = queries.length;          for(let i = 0; i < q; i++)          document.write(rangeAnd(queries[i][0],queries[i][1]) + "</br>");</script> | 
1 2
Time complexity for pre-computation is O(n) and each query can be answered in O(1)
Auxiliary Space: O(bitcount * MAX)
 
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

 
                                    







