Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Practice Bitwise Algorithms
  • MCQs on Bitwise Algorithms
  • Tutorial on Biwise Algorithms
  • Binary Representation
  • Bitwise Operators
  • Bit Swapping
  • Bit Manipulation
  • Count Set bits
  • Setting a Bit
  • Clear a Bit
  • Toggling a Bit
  • Left & Right Shift
  • Gray Code
  • Checking Power of 2
  • Important Tactics
  • Bit Manipulation for CP
  • Fast Exponentiation
Open In App
Next Article:
Count set bits in an integer
Next article icon

Inversion count in Array using BIT

Last Updated : 21 Apr, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Inversion Count for an array indicates – how far (or close) the array is from being sorted. If the array is already sorted then the inversion count is 0. If the array is sorted in the reverse order that inversion count is the maximum. 
Two elements a[i] and a[j] form an inversion if a[i] > a[j] and i < j. For simplicity, we may assume that all elements are unique.
Example: 

Input: arr[] = {8, 4, 2, 1}
Output: 6
Explanation: Given array has six inversions: (8,4), (4,2), (8,2), (8,1), (4,1), (2,1).     

Input: arr[] = {3, 1, 2}
Output: 2
Explanation: Given array has two inversions: (3,1), (3,2).

We strongly recommend that you click here and practice it, before moving on to the solution.

We have already discussed the below methods to solve inversion count:  

  1. Naive and Modified Merge Sort
  2. Using AVL Tree

We recommend you to refer Binary Indexed Tree (BIT) before further reading this post. 
Solution using BIT of size Θ(maxElement):  

  • Approach: Traverse through the array and for every index find the number of smaller elements on the right side of the array. This can be done using BIT. Sum up the counts for all indexes in the array and print the sum.
  • Background on BIT: 
    1. BIT basically supports two operations for an array arr[] of size n: 
      1. Sum of elements till arr[i] in O(log n) time.
      2. Update an array element in O(log n) time.
    2. BIT is implemented using an array and works in form of trees. Note that there are two ways of looking at BIT as a tree. 
      1. The sum operation where parent of index x is “x – (x & -x)”.
      2. The update operation where parent of index x is “x + (x & -x)”.
  • Algorithm: 
    1. Create a BIT, to find the count of the smaller elements in the BIT for a given number and also a variable result = 0.
    2. Traverse the array from end to start.
    3. For every index check how many numbers less than the current element are present in BIT and add it to the result
    4. To get the count of smaller elements, getSum() of BIT is used.
    5. In his basic idea, BIT is represented as an array of size equal to maximum element plus one. So that elements can be used as an index.
    6. After that we add the current element to the BIT[] by doing an update operation that updates the count of the current element from 0 to 1, and therefore updates ancestors of the current element in BIT (See update() in BIT for details).

Below is the implementation of the above approach:

C++
// C++ program to count inversions using Binary Indexed Tree #include<bits/stdc++.h> using namespace std;  // Returns sum of arr[0..index]. This function assumes // that the array is preprocessed and partial sums of // array elements are stored in BITree[]. int getSum(int BITree[], int index) {     int sum = 0; // Initialize result      // Traverse ancestors of BITree[index]     while (index > 0)     {         // Add current element of BITree to sum         sum += BITree[index];          // Move index to parent node in getSum View         index -= index & (-index);     }     return sum; }  // Updates a node in Binary Index Tree (BITree) at given index // in BITree.  The given value 'val' is added to BITree[i] and // all of its ancestors in tree. void updateBIT(int BITree[], int n, int index, int val) {     // Traverse all ancestors and add 'val'     while (index <= n)     {        // Add 'val' to current node of BI Tree        BITree[index] += val;         // Update index to that of parent in update View        index += index & (-index);     } }  // Returns inversion count arr[0..n-1] int getInvCount(int arr[], int n) {     int invcount = 0; // Initialize result      // Find maximum element in arr[]     int maxElement = 0;     for (int i=0; i<n; i++)         if (maxElement < arr[i])             maxElement = arr[i];      // Create a BIT with size equal to maxElement+1 (Extra     // one is used so that elements can be directly be     // used as index)     int BIT[maxElement+1];     for (int i=1; i<=maxElement; i++)         BIT[i] = 0;      // Traverse all elements from right.     for (int i=n-1; i>=0; i--)     {         // Get count of elements smaller than arr[i]         invcount += getSum(BIT, arr[i]-1);          // Add current element to BIT         updateBIT(BIT, maxElement, arr[i], 1);     }      return invcount; }  // Driver program int main() {     int arr[] = {8, 4, 2, 1};     int n = sizeof(arr)/sizeof(int);     cout << "Number of inversions are : " << getInvCount(arr,n);     return 0; } 
Java
// Java program to count inversions  // using Binary Indexed Tree  class GFG {      // Returns sum of arr[0..index].  // This function assumes that the  // array is preprocessed and partial // sums of array elements are stored // in BITree[]. static int getSum(int[] BITree, int index) {     int sum = 0; // Initialize result      // Traverse ancestors of BITree[index]     while (index > 0)     {         // Add current element of BITree to sum         sum += BITree[index];          // Move index to parent node in getSum View         index -= index & (-index);     }     return sum; }  // Updates a node in Binary Index // Tree (BITree) at given index // in BITree. The given value 'val'  // is added to BITree[i] and all // of its ancestors in tree. static void updateBIT(int[] BITree, int n,                         int index, int val) {     // Traverse all ancestors and add 'val'     while (index <= n)     {         // Add 'val' to current node of BI Tree         BITree[index] += val;          // Update index to that of parent in update View         index += index & (-index);     } }  // Returns inversion count arr[0..n-1] static int getInvCount(int[] arr, int n) {     int invcount = 0; // Initialize result      // Find maximum element in arr[]     int maxElement = 0;     for (int i = 0; i < n; i++)         if (maxElement < arr[i])             maxElement = arr[i];      // Create a BIT with size equal to      // maxElement+1 (Extra one is used so      // that elements can be directly be     // used as index)     int[] BIT = new int[maxElement + 1];     for (int i = 1; i <= maxElement; i++)         BIT[i] = 0;      // Traverse all elements from right.     for (int i = n - 1; i >= 0; i--)     {         // Get count of elements smaller than arr[i]         invcount += getSum(BIT, arr[i] - 1);          // Add current element to BIT         updateBIT(BIT, maxElement, arr[i], 1);     }      return invcount; }  // Driver code public static void main (String[] args) {     int []arr = {8, 4, 2, 1};     int n = arr.length;     System.out.println("Number of inversions are : " +                                 getInvCount(arr,n)); } }  // This code is contributed by mits 
Python3
# Python3 program to count inversions using  # Binary Indexed Tree   # Returns sum of arr[0..index]. This function # assumes that the array is preprocessed and  # partial sums of array elements are stored  # in BITree[].  def getSum( BITree, index):     sum = 0 # Initialize result           # Traverse ancestors of BITree[index]      while (index > 0):           # Add current element of BITree to sum          sum += BITree[index]           # Move index to parent node in getSum View          index -= index & (-index)       return sum  # Updates a node in Binary Index Tree (BITree)  # at given index in BITree. The given value # 'val' is added to BITree[i] and all of its # ancestors in tree.  def updateBIT(BITree, n, index, val):      # Traverse all ancestors and add 'val'      while (index <= n):           # Add 'val' to current node of BI Tree          BITree[index] += val           # Update index to that of parent         # in update View          index += index & (-index)   # Returns count of inversions of size three  def getInvCount(arr, n):      invcount = 0 # Initialize result       # Find maximum element in arrays      maxElement = max(arr)      # Create a BIT with size equal to      # maxElement+1 (Extra one is used      # so that elements can be directly      # be used as index)     BIT = [0] * (maxElement + 1)      for i in range(n - 1, -1, -1):          invcount += getSum(BIT, arr[i] - 1)          updateBIT(BIT, maxElement, arr[i], 1)      return invcount       # Driver code  if __name__ =="__main__":     arr = [8, 4, 2, 1]      n = 4     print("Inversion Count : ",             getInvCount(arr, n))      # This code is contributed by # Shubham Singh(SHUBHAMSINGH10) 
C#
// C# program to count inversions  // using Binary Indexed Tree using System;  class GFG {      // Returns sum of arr[0..index].  // This function assumes that the  // array is preprocessed and partial // sums of array elements are stored // in BITree[]. static int getSum(int []BITree, int index) {     int sum = 0; // Initialize result      // Traverse ancestors of BITree[index]     while (index > 0)     {         // Add current element of BITree to sum         sum += BITree[index];          // Move index to parent node in getSum View         index -= index & (-index);     }     return sum; }  // Updates a node in Binary Index // Tree (BITree) at given index // in BITree. The given value 'val'  // is added to BITree[i] and all // of its ancestors in tree. static void updateBIT(int []BITree, int n,                         int index, int val) {     // Traverse all ancestors and add 'val'     while (index <= n)     {         // Add 'val' to current node of BI Tree         BITree[index] += val;          // Update index to that of parent in update View         index += index & (-index);     } }  // Returns inversion count arr[0..n-1] static int getInvCount(int []arr, int n) {     int invcount = 0; // Initialize result      // Find maximum element in arr[]     int maxElement = 0;     for (int i = 0; i < n; i++)         if (maxElement < arr[i])             maxElement = arr[i];      // Create a BIT with size equal to      // maxElement+1 (Extra one is used so      // that elements can be directly be     // used as index)     int[] BIT = new int[maxElement + 1];     for (int i = 1; i <= maxElement; i++)         BIT[i] = 0;      // Traverse all elements from right.     for (int i = n - 1; i >= 0; i--)     {         // Get count of elements smaller than arr[i]         invcount += getSum(BIT, arr[i] - 1);          // Add current element to BIT         updateBIT(BIT, maxElement, arr[i], 1);     }      return invcount; }  // Driver code static void Main() {     int []arr = {8, 4, 2, 1};     int n = arr.Length;     Console.WriteLine("Number of inversions are : " +                                 getInvCount(arr,n)); } }  // This code is contributed by mits 
JavaScript
<script> // javascript program to count inversions  // using Binary Indexed Tree    // Returns sum of arr[0..index].  // This function assumes that the  // array is preprocessed and partial // sums of array elements are stored // in BITree. function getSum(BITree , index) {     var sum = 0; // Initialize result      // Traverse ancestors of BITree[index]     while (index > 0)     {         // Add current element of BITree to sum         sum += BITree[index];          // Move index to parent node in getSum View         index -= index & (-index);     }     return sum; }  // Updates a node in Binary Index // Tree (BITree) at given index // in BITree. The given value 'val'  // is added to BITree[i] and all // of its ancestors in tree. function updateBIT(BITree , n, index , val) {     // Traverse all ancestors and add 'val'     while (index <= n)     {         // Add 'val' to current node of BI Tree         BITree[index] += val;          // Update index to that of parent in update View         index += index & (-index);     } }  // Returns inversion count arr[0..n-1] function getInvCount(arr , n) {     var invcount = 0; // Initialize result      // Find maximum element in arr     var maxElement = 0;     for (i = 0; i < n; i++)         if (maxElement < arr[i])             maxElement = arr[i];      // Create a BIT with size equal to      // maxElement+1 (Extra one is used so      // that elements can be directly be     // used as index)     var BIT = Array.from({length: maxElement + 1}, (_, i) => 0);     for (i = 1; i <= maxElement; i++)         BIT[i] = 0;      // Traverse all elements from right.     for (i = n - 1; i >= 0; i--)     {         // Get count of elements smaller than arr[i]         invcount += getSum(BIT, arr[i] - 1);          // Add current element to BIT         updateBIT(BIT, maxElement, arr[i], 1);     }      return invcount; }  // Driver code     var arr = [8, 4, 2, 1];     var n = arr.length;     document.write("Number of inversions are : " +                                 getInvCount(arr,n));  // This code is contributed by Amit Katiyar  </script> 
PHP
<?php // PHP program to count inversions // using Binary Indexed Tree  // Returns sum of arr[0..index]. // This function assumes that the // array is preprocessed and partial  // sums of array elements are stored  // in BITree[]. function getSum($BITree, $index) {     $sum = 0; // Initialize result      // Traverse ancestors of BITree[index]     while ($index > 0)     {         // Add current element of BITree to sum         $sum += $BITree[$index];          // Move index to parent node in getSum View         $index -= $index & (-$index);     }     return $sum; }  // Updates a node in Binary Index  // Tree (BITree) at given index // in BITree. The given value 'val' // is added to BITree[i] and // all of its ancestors in tree. function updateBIT(&$BITree, $n, $index,$val) {     // Traverse all ancestors and add 'val'     while ($index <= $n)     {         // Add 'val' to current node of BI Tree         $BITree[$index] += $val;          // Update index to that of          // parent in update View         $index += $index & (-$index);     } }  // Returns inversion count arr[0..n-1] function getInvCount($arr, $n) {     $invcount = 0; // Initialize result      // Find maximum element in arr[]     $maxElement = 0;     for ($i=0; $i<$n; $i++)         if ($maxElement < $arr[$i])             $maxElement = $arr[$i];      // Create a BIT with size equal     // to maxElement+1 (Extra one is     // used so that elements can be      // directly be used as index)     $BIT=array_fill(0,$maxElement+1,0);      // Traverse all elements from right.     for ($i=$n-1; $i>=0; $i--)     {         // Get count of elements smaller than arr[i]         $invcount += getSum($BIT, $arr[$i]-1);          // Add current element to BIT         updateBIT($BIT, $maxElement, $arr[$i], 1);     }      return $invcount; }      // Driver program     $arr = array(8, 4, 2, 1);     $n = count($arr);     print("Number of inversions are : ".getInvCount($arr,$n));  // This code is contributed by mits ?> 

Output
Number of inversions are : 6

Time Complexity :- The update function and getSum function runs for O(log(maximumelement)). The getSum function has to be run for every element in the array. So overall time complexity is : O(nlog(maximumelement)).
Auxiliary space : O(maxElement), space required for the BIT is an array of the size of the largest element.

Better solution using BIT of size Θ(n): 
Approach: Traverse through the array and for every index find the number of smaller elements on its right side of the array. This can be done using BIT. Sum up the counts for all indexes in the array and print the sum. The approach remains the same but the problem with the previous approach is that it doesn’t work for negative numbers as the index cannot be negative. The idea is to convert the given array to an array with values from 1 to n and the relative order of smaller and greater elements remains the same.
Example:

 
arr[] = {7, -90, 100, 1}
It gets converted to,
arr[] = {3, 1, 4 ,2 }
as -90 < 1 < 7 < 100.

Explanation: Make a BIT array of a number of
elements instead of a maximum element. Changing
element will not have any change in the answer
as the greater elements remain greater and at the
same position.

Algorithm: 

  1. Create a BIT, to find the count of the smaller elements in the BIT for a given number and also a variable result = 0.
  2. The previous solution does not work for arrays containing negative elements. So, convert the array into an array containing relative numbering of elements,i.e make a copy of the original array and then sort the copy of the array and replace the elements in the original array with the indices of the same elements in the sorted array. 
    For example, if the array is {-3, 2, 0} then the array gets converted to {1, 3, 2}
  3. Traverse the array from end to start.
  4. For every index check how many numbers less than the current element are present in BIT and add it to the result

Below is the implementation of the above approach: 

C++
// C++ program to count inversions using Binary Indexed Tree #include<bits/stdc++.h> using namespace std;  // Returns sum of arr[0..index]. This function assumes // that the array is preprocessed and partial sums of // array elements are stored in BITree[]. int getSum(int BITree[], int index) {     int sum = 0; // Initialize result      // Traverse ancestors of BITree[index]     while (index > 0)     {         // Add current element of BITree to sum         sum += BITree[index];          // Move index to parent node in getSum View         index -= index & (-index);     }     return sum; }  // Updates a node in Binary Index Tree (BITree) at given index // in BITree.  The given value 'val' is added to BITree[i] and // all of its ancestors in tree. void updateBIT(int BITree[], int n, int index, int val) {     // Traverse all ancestors and add 'val'     while (index <= n)     {        // Add 'val' to current node of BI Tree        BITree[index] += val;         // Update index to that of parent in update View        index += index & (-index);     } }  // Converts an array to an array with values from 1 to n // and relative order of smaller and greater elements remains // same.  For example, {7, -90, 100, 1} is converted to // {3, 1, 4 ,2 } void convert(int arr[], int n) {     // Create a copy of arrp[] in temp and sort the temp array     // in increasing order     int temp[n];     for (int i=0; i<n; i++)         temp[i] = arr[i];     sort(temp, temp+n);      // Traverse all array elements     for (int i=0; i<n; i++)     {         // lower_bound() Returns pointer to the first element         // greater than or equal to arr[i]         arr[i] = lower_bound(temp, temp+n, arr[i]) - temp + 1;     } }  // Returns inversion count arr[0..n-1] int getInvCount(int arr[], int n) {     int invcount = 0; // Initialize result       // Convert arr[] to an array with values from 1 to n and      // relative order of smaller and greater elements remains      // same.  For example, {7, -90, 100, 1} is converted to     //  {3, 1, 4 ,2 }     convert(arr, n);      // Create a BIT with size equal to maxElement+1 (Extra     // one is used so that elements can be directly be     // used as index)     int BIT[n+1];     for (int i=1; i<=n; i++)         BIT[i] = 0;      // Traverse all elements from right.     for (int i=n-1; i>=0; i--)     {         // Get count of elements smaller than arr[i]         invcount += getSum(BIT, arr[i]-1);          // Add current element to BIT         updateBIT(BIT, n, arr[i], 1);     }      return invcount; }  // Driver program int main() {     int arr[] = {8, 4, 2, 1};     int n = sizeof(arr)/sizeof(int);     cout << "Number of inversions are : " << getInvCount(arr,n);     return 0; } 
Java
// Java program to count inversions  // using Binary Indexed Tree import java.util.*; class GFG{  // Returns sum of arr[0..index].  // This function assumes that the  // array is preprocessed and partial  // sums of array elements are stored  // in BITree[]. static int getSum(int BITree[],                   int index) {   // Initialize result   int sum = 0;     // Traverse ancestors of   // BITree[index]   while (index > 0)   {     // Add current element of     // BITree to sum     sum += BITree[index];      // Move index to parent node      // in getSum View     index -= index & (-index);   }   return sum; }  // Updates a node in Binary Index Tree  // (BITree) at given index in BITree.   // The given value 'val' is added to  // BITree[i] and all of its ancestors  // in tree. static void updateBIT(int BITree[], int n,                        int index, int val) {   // Traverse all ancestors    // and add 'val'   while (index <= n)   {     // Add 'val' to current      // node of BI Tree     BITree[index] += val;      // Update index to that of      // parent in update View     index += index & (-index);   } }  // Converts an array to an array  // with values from 1 to n and  // relative order of smaller and  // greater elements remains same.   // For example, {7, -90, 100, 1}  // is converted to {3, 1, 4 ,2 } static void convert(int arr[],                      int n) {   // Create a copy of arrp[] in temp    // and sort the temp array in    // increasing order   int []temp = new int[n];      for (int i = 0; i < n; i++)     temp[i] = arr[i];   Arrays.sort(temp);    // Traverse all array elements   for (int i = 0; i < n; i++)   {     // lower_bound() Returns pointer      // to the first element greater      // than or equal to arr[i]     arr[i] =lower_bound(temp,0,                          n, arr[i]) + 1;   } }  static int lower_bound(int[] a, int low,                         int high, int element) {   while(low < high)   {     int middle = low +                  (high - low) / 2;     if(element > a[middle])       low = middle + 1;     else        high = middle;   }   return low; }  // Returns inversion count  // arr[0..n-1] static int getInvCount(int arr[],                         int n) {   // Initialize result   int invcount = 0;     // Convert arr[] to an array    // with values from 1 to n and   // relative order of smaller    // and greater elements remains   // same.  For example, {7, -90,    // 100, 1} is converted to   //  {3, 1, 4 ,2 }   convert(arr, n);    // Create a BIT with size equal    // to maxElement+1 (Extra one is    // used so that elements can be    // directly be used as index)   int []BIT = new int[n + 1];      for (int i = 1; i <= n; i++)     BIT[i] = 0;    // Traverse all elements    // from right.   for (int i = n - 1; i >= 0; i--)   {     // Get count of elements      // smaller than arr[i]     invcount += getSum(BIT,                         arr[i] - 1);      // Add current element to BIT     updateBIT(BIT, n, arr[i], 1);   }    return invcount; }  // Driver code public static void main(String[] args) {   int arr[] = {8, 4, 2, 1};   int n = arr.length;   System.out.print("Number of inversions are : " +                       getInvCount(arr, n)); } }  // This code is contributed by Amit Katiyar  
Python3
# Python3 program to count inversions using Binary Indexed Tree from bisect import bisect_left as lower_bound  # Returns sum of arr[0..index]. This function assumes # that the array is preprocessed and partial sums of # array elements are stored in BITree. def getSum(BITree, index):      sum = 0 # Initialize result      # Traverse ancestors of BITree[index]     while (index > 0):          # Add current element of BITree to sum         sum += BITree[index]          # Move index to parent node in getSum View         index -= index & (-index)      return sum  # Updates a node in Binary Index Tree (BITree) at given index # in BITree. The given value 'val' is added to BITree[i] and # all of its ancestors in tree. def updateBIT(BITree, n, index, val):      # Traverse all ancestors and add 'val'     while (index <= n):          # Add 'val' to current node of BI Tree         BITree[index] += val      # Update index to that of parent in update View     index += index & (-index)  # Converts an array to an array with values from 1 to n # and relative order of smaller and greater elements remains # same. For example, 7, -90, 100, 1 is converted to # 3, 1, 4 ,2 def convert(arr, n):      # Create a copy of arrp in temp and sort the temp array     # in increasing order     temp = [0]*(n)     for i in range(n):         temp[i] = arr[i]     temp = sorted(temp)      # Traverse all array elements     for i in range(n):          # lower_bound() Returns pointer to the first element         # greater than or equal to arr[i]         arr[i] = lower_bound(temp, arr[i]) + 1  # Returns inversion count arr[0..n-1] def getInvCount(arr, n):      invcount = 0 # Initialize result      # Convert arr to an array with values from 1 to n and     # relative order of smaller and greater elements remains     # same. For example, 7, -90, 100, 1 is converted to     # 3, 1, 4 ,2     convert(arr, n)      # Create a BIT with size equal to maxElement+1 (Extra     # one is used so that elements can be directly be     # used as index)     BIT = [0] * (n + 1)      # Traverse all elements from right.     for i in range(n - 1, -1, -1):          # Get count of elements smaller than arr[i]         invcount += getSum(BIT, arr[i] - 1)          # Add current element to BIT         updateBIT(BIT, n, arr[i], 1)      return invcount  # Driver program if __name__ == '__main__':      arr = [8, 4, 2, 1]     n = len(arr)     print("Number of inversions are : ",getInvCount(arr, n))  # This code is contributed by mohit kumar 29 
C#
// C# program to count inversions  // using Binary Indexed Tree using System; class GFG{  // Returns sum of arr[0..index].  // This function assumes that the  // array is preprocessed and partial  // sums of array elements are stored  // in BITree[]. static int getSum(int []BITree,                   int index) {   // Initialize result   int sum = 0;     // Traverse ancestors of   // BITree[index]   while (index > 0)   {     // Add current element of     // BITree to sum     sum += BITree[index];      // Move index to parent node      // in getSum View     index -= index & (-index);   }   return sum; }  // Updates a node in Binary Index Tree  // (BITree) at given index in BITree.   // The given value 'val' is added to  // BITree[i] and all of its ancestors  // in tree. static void updateBIT(int []BITree, int n,                        int index, int val) {   // Traverse all ancestors    // and add 'val'   while (index <= n)   {     // Add 'val' to current      // node of BI Tree     BITree[index] += val;      // Update index to that of      // parent in update View     index += index & (-index);   } }  // Converts an array to an array  // with values from 1 to n and  // relative order of smaller and  // greater elements remains same.   // For example, {7, -90, 100, 1}  // is converted to {3, 1, 4 ,2 } static void convert(int []arr,                      int n) {   // Create a copy of arrp[] in temp    // and sort the temp array in    // increasing order   int []temp = new int[n];      for (int i = 0; i < n; i++)     temp[i] = arr[i];   Array.Sort(temp);    // Traverse all array elements   for (int i = 0; i < n; i++)   {     // lower_bound() Returns pointer      // to the first element greater      // than or equal to arr[i]     arr[i] =lower_bound(temp,0,                          n, arr[i]) + 1;   } }  static int lower_bound(int[] a, int low,                         int high, int element) {   while(low < high)   {     int middle = low +                  (high - low) / 2;     if(element > a[middle])       low = middle + 1;     else        high = middle;   }   return low; }  // Returns inversion count  // arr[0..n-1] static int getInvCount(int []arr,                         int n) {   // Initialize result   int invcount = 0;     // Convert []arr to an array    // with values from 1 to n and   // relative order of smaller    // and greater elements remains   // same.  For example, {7, -90,    // 100, 1} is converted to   //  {3, 1, 4 ,2 }   convert(arr, n);    // Create a BIT with size equal    // to maxElement+1 (Extra one is    // used so that elements can be    // directly be used as index)   int []BIT = new int[n + 1];      for (int i = 1; i <= n; i++)     BIT[i] = 0;    // Traverse all elements    // from right.   for (int i = n - 1; i >= 0; i--)   {     // Get count of elements      // smaller than arr[i]     invcount += getSum(BIT,                         arr[i] - 1);      // Add current element      // to BIT     updateBIT(BIT, n,                arr[i], 1);   }    return invcount; }  // Driver code public static void Main(String[] args) {   int []arr = {8, 4, 2, 1};   int n = arr.Length;   Console.Write("Number of inversions are : " +                    getInvCount(arr, n)); } }  // This code is contributed by Amit Katiyar  
JavaScript
<script> // Javascript program to count inversions // using Binary Indexed Tree      // Returns sum of arr[0..index]. // This function assumes that the // array is preprocessed and partial // sums of array elements are stored // in BITree[].     function getSum(BITree,index) {          // Initialize result   let sum = 0;     // Traverse ancestors of   // BITree[index]   while (index > 0)   {        // Add current element of     // BITree to sum     sum += BITree[index];       // Move index to parent node     // in getSum View     index -= index & (-index);   }   return sum; }  // Updates a node in Binary Index Tree // (BITree) at given index in BITree.  // The given value 'val' is added to // BITree[i] and all of its ancestors // in tree. function updateBIT(BITree,n,index,val) {      // Traverse all ancestors   // and add 'val'   while (index <= n)   {        // Add 'val' to current     // node of BI Tree     BITree[index] += val;       // Update index to that of     // parent in update View     index += index & (-index);   } }  // Converts an array to an array // with values from 1 to n and // relative order of smaller and // greater elements remains same.  // For example, {7, -90, 100, 1} // is converted to {3, 1, 4 ,2 } function convert(arr, n) {      // Create a copy of arrp[] in temp   // and sort the temp array in   // increasing order   let temp = new Array(n);       for (let i = 0; i < n; i++)     temp[i] = arr[i];   temp.sort(function(a, b){return a - b;});     // Traverse all array elements   for (let i = 0; i < n; i++)   {     // lower_bound() Returns pointer     // to the first element greater     // than or equal to arr[i]     arr[i] =lower_bound(temp,0,                         n, arr[i]) + 1;   } }  function lower_bound(a,low,high,element) {     while(low < high)   {     let middle = low +                 Math.floor((high - low) / 2);     if(element > a[middle])       low = middle + 1;     else       high = middle;   }   return low; }  // Returns inversion count // arr[0..n-1] function getInvCount(arr,n) {     // Initialize result   let invcount = 0;     // Convert arr[] to an array   // with values from 1 to n and   // relative order of smaller   // and greater elements remains   // same.  For example, {7, -90,   // 100, 1} is converted to   //  {3, 1, 4 ,2 }   convert(arr, n);     // Create a BIT with size equal   // to maxElement+1 (Extra one is   // used so that elements can be   // directly be used as index)   let BIT = new Array(n + 1);       for (let i = 1; i <= n; i++)     BIT[i] = 0;     // Traverse all elements   // from right.   for (let i = n - 1; i >= 0; i--)   {     // Get count of elements     // smaller than arr[i]     invcount += getSum(BIT,                        arr[i] - 1);       // Add current element to BIT     updateBIT(BIT, n, arr[i], 1);   }     return invcount; }  // Driver code let arr=[8, 4, 2, 1]; let n = arr.length; document.write("Number of inversions are : " +                      getInvCount(arr, n));      // This code is contributed by unknown2108 </script> 

Output
Number of inversions are : 6

Time Complexity: The update function and getSum function runs for O(log(n)). The getSum function has to be run for every element in the array. So overall time complexity is O(nlog(n)).
Auxiliary Space: O(n). 
Space required for the BIT is an array of the size n.



Next Article
Count set bits in an integer

A

Abhiraj Smit
Improve
Article Tags :
  • Advanced Data Structure
  • Bit Magic
  • DSA
  • Mathematical
  • Binary Indexed Tree
  • inversion
Practice Tags :
  • Advanced Data Structure
  • Bit Magic
  • Mathematical

Similar Reads

  • Count inversions in an array | Set 4 ( Using Trie )
    Inversion Count for an array indicates – how far (or close) the array is from being sorted. If the array is already sorted then inversion count is 0. If the array is sorted in reverse order that inversion count is the maximum. Two elements a[i] and a[j] form an inversion if a[i] > a[j] and i <
    12 min read
  • Count number of Inversion in a Binary Array
    Given a Binary Array arr[], the task is to count the number of inversions in it. The number of inversions in an array is the number of pairs of indices i, j such that i < j and a[i] > a[j]. Examples: Input: arr[] = {1, 0, 1, 0, 0, 1, 0}Output: 8Explanation: Pairs of the index (i, j) are (0, 1)
    5 min read
  • Counting Inversions using Set in C++ STL
    Inversion Count for an array indicates – how far (or close) the array is from being sorted. If array is already sorted then inversion count is 0. If array is sorted in reverse order that inversion count is the maximum. Two elements a[i] and a[j] form an inversion if a[i] > a[j] and i < j. For
    3 min read
  • Count set bits in an integer
    Write an efficient program to count the number of 1s in the binary representation of an integer.Examples : Input : n = 6Output : 2Binary representation of 6 is 110 and has 2 set bits Input : n = 13Output : 3Binary representation of 13 is 1101 and has 3 set bits [Naive Approach] - One by One Counting
    15+ min read
  • Counting inversions in an subarrays
    Given an array arr[], the goal is to count the number of inversions in all the sub-arrays. An inversion is a pair of indices i and j such that i > j and arr[i] < arr[j]. A sub-array from index x to y ( x<= y) consists of the element's arr[x], arr[x+1], ..., arr[y]. The array arr[] can also
    15+ min read
  • Count Inversions of size three in a given array
    Given an array arr[] of size n. Three elements arr[i], arr[j] and arr[k] form an inversion of size 3 if a[i] > a[j] >a[k] and i < j < k. Find total number of inversions of size 3. Example : Input: {8, 4, 2, 1} Output: 4 The four inversions are (8,4,2), (8,4,1), (4,2,1) and (8,2,1). Input
    15+ min read
  • Count inversion pairs in a matrix
    Given a matrix A of size NxN, we need to find the number of inversion pairs in it. Inversion count in a matrix is defined as the number of pairs satisfying the following conditions : x1 ? x2y1 ? y2A[x2][y2] < A[x1][y1] Constraints : 1 ? Ai,j ? 1091 ? N ? 103 Examples: For simplicity, let's take a
    15 min read
  • Significant Inversions in an Array
    Given an array arr[], the task is to finds the total significant inversion count for the array. Two elements arr[i] and arr[j] form a significant inversion if arr[i] > 2 * arr[j] and i < j.Examples: Input: arr[] = { 1, 20, 6, 4, 5 } Output: 3 Significant inversion pair are (20, 6), (20, 5) and
    13 min read
  • Count total set bits in an array
    Given an array arr, the task is to count the total number of set bits in all numbers of that array arr. Example: Input: arr[] = {1, 2, 5, 7}Output: 7Explanation: Number of set bits in {1, 2, 5, 7} are {1, 1, 2, 3} respectively Input: arr[] = {0, 4, 9, 8}Output: 4 Approach: Follow the below steps to
    5 min read
  • Find Duplicates of array using bit array
    You have an array of N numbers, where N is at most 32,000. The array may have duplicate entries and you do not know what N is. With only 4 Kilobytes of memory available, how would print all duplicate elements in the array ?. Examples: Input : arr[] = {1, 5, 1, 10, 12, 10} Output : 1 10 1 and 10 appe
    8 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences