# Count of acute, obtuse and right triangles with given sides

Given an array of n positive distinct integers representing lengths of lines that can form a triangle. The task is to find the number of acute triangles, obtuse triangles, and right triangles separately that can be formed from the given array.

Examples:

```Input : arr[] = { 2, 3, 9, 10, 12, 15 }.
Output :
Acute Triangle: 2
Right Triangle: 1
Obtuse Triangle: 4

Acute triangles that can be formed are {10, 12, 15}
and { 9, 10, 12 }.
Right triangles that can be formed are {9, 12, 15}.
Obtuse triangles that can be formed are {2, 9, 10},
{3, 9, 10}, {3, 10, 12} and {9, 10, 15}.

```

Triangle having edges a, b, c, a <= b c.
If a2 + b2 > c2, then it is acute triangle.
If a2 + b2 = c2, then it is right triangle.
If a2 + b2 < c2, then it is obtuse triangle.

Method 1 (Simple): A brute force can be, use three loops, one for each side. Check the above three conditions if a triangle is possible from three sides.

Method 2 (Efficient): An efficient approach is to first sort the array and run two loops for side a and b (a<b). Then find the farthest point q where a + b > c. So, from b to q all triangle are possible.
Also find a farthest point p where a2 + b2 >= c2
Now, observe if a2 + b2 = c2, then increment count of right triangles. Also, the acute triangle will be p – b – 1, and the obtuse triangle will be q – p.

 `// C++ program to count of acute, obtuse and right` `// triangles in an array` `#include ` `using` `namespace` `std;`   `// Find the number of acute, right, obtuse triangle` `// that can be formed from given array.` `void` `findTriangle(``int` `a[], ``int` `n)` `{` `    ``int` `b[n + 2];`   `    ``// Finding the square of each element of array.` `    ``for` `(``int` `i = 0; i < n; i++)` `        ``b[i] = a[i] * a[i];`   `    ``// Sort the sides of array and their squares.` `    ``sort(a, a + n);` `    ``sort(b, b + n);`   `    ``// x for acute triangles` `    ``// y for right triangles` `    ``// z for obtuse triangles` `    ``int` `x=0,y=0,z=0;` `    ``for` `(``int` `i=0; i= c^2.` `            ``while` `(p=b[p+1])` `                ``p++;`   `            ``q = max(q, p);`   `            ``// Finding the farthest point q where` `            ``// a + b > c.` `            ``while` `(qa[q+1])` `                ``q++;`   `            ``// If point p make right triangle.` `            ``if` `(b[i]+b[j]==b[p])` `            ``{` `                ``// All triangle between j and p are acute` `                ``// triangles. So add p - j - 1 in x.` `                ``x += max(p - j - 1, 0);`   `                ``// Increment y by 1.` `                ``y++;`   `                ``// All triangle between q and p are acute` `                ``// triangles. So add q - p in z.` `                ``z += q - p;` `            ``}`   `            ``// If no right triangle` `            ``else` `            ``{` `                ``// All triangle between j and p are acute` `                ``// triangles. So add p - j in x.` `                ``x += max(p - j, 0);`   `                ``// All triangle between q and p are acute` `                ``// triangles. So add q - p in z.` `                ``z += q - p;` `            ``}` `        ``}` `    ``}`   `    ``cout << ``"Acute Triangle: "` `<< x << endl;` `    ``cout << ``"Right Triangle: "` `<< y << endl;` `    ``cout << ``"Obtuse Triangle: "` `<< z << endl;` `}`   `// Driver Code` `int` `main()` `{` `    ``int` `arr[] = {2, 3, 9, 10, 12, 15};` `    ``int` `n = ``sizeof``(arr)/``sizeof``(arr[0]);` `    ``findTriangle(arr, n);` `    ``return` `0;` `}`

 `// Java program to count of ` `// acute, obtuse and right` `// triangles in an array` `import` `java.util.*;` `class` `GFG{` `    `  `// Find the number of acute, ` `// right, obtuse triangle` `// that can be formed from ` `// given array.` `static` `void` `findTriangle(``int` `a[], ` `                         ``int` `n)` `{` `  ``int` `b[] = ``new` `int``[n];`   `  ``// Finding the square of ` `  ``// each element of array.` `  ``for` `(``int` `i = ``0``; i < n; i++)` `    ``b[i] = a[i] * a[i];`   `  ``// Sort the sides of array ` `  ``// and their squares.` `  ``Arrays.sort(a);` `  ``Arrays.sort(b);`   `  ``// x for acute triangles` `  ``// y for right triangles` `  ``// z for obtuse triangles` `  ``int` `x = ``0``, y = ``0``, z = ``0``;` `  ``for` `(``int` `i = ``0``; i < n; i++) ` `  ``{` `    ``int` `p = i + ``1``;` `    ``int` `q = i + ``1``;`   `    ``for` `(``int` `j = i + ``1``; j < n; j++) ` `    ``{` `      ``// Finding the farthest point ` `      ``// p where a^2 + b^2 >= c^2.` `      ``while` `(p < n - ``1` `&& ` `             ``b[i] + b[j] >= b[p + ``1``])` `        ``p++;`   `      ``q = Math.max(q, p);`   `      ``// Finding the farthest point ` `      ``// q where a + b > c.` `      ``while` `(q < n - ``1` `&& ` `             ``a[i] + a[j] > a[q + ``1``])` `        ``q++;`   `      ``// If point p make right triangle.` `      ``if` `(b[i] + b[j] == b[p]) ` `      ``{` `        ``// All triangle between j ` `        ``// and p are acute triangles. ` `        ``// So add p - j - 1 in x.` `        ``x += Math.max(p - j - ``1``, ``0``);`   `        ``// Increment y by 1.` `        ``y++;`   `        ``// All triangle between q ` `        ``// and p are acute triangles. ` `        ``// So add q - p in z.` `        ``z += q - p;` `      ``}`   `      ``// If no right triangle` `      ``else` `      ``{` `        ``// All triangle between ` `        ``// j and p are acute triangles. ` `        ``// So add p - j in x.` `        ``x += Math.max(p - j, ``0``);`   `        ``// All triangle between q ` `        ``// and p are acute triangles. ` `        ``// So add q - p in z.` `        ``z += q - p;` `      ``}` `    ``}` `  ``}` ` `  `  ``System.out.println(``"Acute Triangle: "` `+ x);` `  ``System.out.println(``"Right Triangle: "` `+ y);` `  ``System.out.println(``"Obtuse Triangle: "` `+ z);` `}`   `// Driver Code` `public` `static` `void` `main(String[] args)` `{` `  ``int` `arr[] = {``2``, ``3``, ``9``, ``10``, ``12``, ``15``};` `  ``int` `n = arr.length;` `  ``findTriangle(arr, n);` `}` `}`   `// This code is contributed by Chitranayal`

 `# Python3 program to count of acute, obtuse and right ` `# triangles in an array `   `# Find the number of acute, right, obtuse triangle ` `# that can be formed from given array. ` `def` `findTriangle(a, n) :` `    `  `    ``b ``=` `[]` `    ``# Finding the square of each element of array` `    ``for` `i ``in` `range``(n) :` `        ``b.append(a[i] ``*` `a[i])` `    `  `    ``# Sort the sides of array and their squares. ` `    ``a.sort()` `    ``b.sort() ` `   `  `    ``# x for acute triangles` `    ``# y for right triangles` `    ``# z for obtuse triangles` `    ``x, y, z ``=` `0``, ``0``, ``0` `    `  `    ``for` `i ``in` `range``(n) :` `        ``p ``=` `i``+``1` `        ``q ``=` `i``+``1` `        ``for` `j ``in` `range``(i ``+` `1``, n) :` `            ``# Finding the farthest point p where` `            ``# a^2 + b^2 >= c^2.` `            ``while` `(p``=``b[p``+``1``]) :` `                ``p ``+``=` `1` `            ``q ``=` `max``(q, p)` `            ``# Finding the farthest point q where ` `            ``# a + b > c.` `            ``while` `(qa[q``+``1``]) :` `                ``q ``+``=` `1` `                `  `            ``# If point p make right triangle.` `            ``if` `(b[i]``+``b[j]``=``=``b[p]) :` `                ``# All triangle between j and p are acute` `                ``# triangles. So add p - j - 1 in x.` `                ``x ``+``=` `max``(p ``-` `j ``-` `1``, ``0``)` `                ``# Increment y by 1.` `                ``y ``+``=` `1` `                ``# All triangle between q and p are acute` `                ``# triangles. So add q - p in z.` `                ``z ``+``=` `q ``-` `p` `            ``# If no right triangle` `            ``else` `:` `                ``# All triangle between j and p are acute` `                ``# triangles. So add p - j in x.` `                ``x ``+``=` `max``(p ``-` `j, ``0``)` `                ``# All triangle between q and p are acute ` `                ``# triangles. So add q - p in z.` `                ``z ``+``=` `q ``-` `p` `    `  `    ``print``(``"Acute Triangle:"``,x )` `    ``print``(``"Right Triangle:"``, y) ` `    ``print``(``"Obtuse Triangle:"``, z) `     `# Driver Code ` `if` `__name__ ``=``=` `"__main__"` `:`   `    ``arr ``=` `[``2``, ``3``, ``9``, ``10``, ``12``, ``15``]` `    ``n ``=` `len``(arr)` `    ``findTriangle(arr, n)`   `# This code is contributed by Ryuga`

 `// C# program to count of ` `// acute, obtuse and right` `// triangles in an array` `using` `System;`   `class` `GFG{` `     `  `// Find the number of acute, ` `// right, obtuse triangle` `// that can be formed from ` `// given array.` `static` `void` `findTriangle(``int` `[]a, ``int` `n)` `{` `  ``int` `[]b = ``new` `int``[n];` ` `  `  ``// Finding the square of ` `  ``// each element of array.` `  ``for``(``int` `i = 0; i < n; i++)` `    ``b[i] = a[i] * a[i];` ` `  `  ``// Sort the sides of array ` `  ``// and their squares.` `  ``Array.Sort(a);` `  ``Array.Sort(b);` ` `  `  ``// x for acute triangles` `  ``// y for right triangles` `  ``// z for obtuse triangles` `  ``int` `x = 0, y = 0, z = 0;` `  ``for``(``int` `i = 0; i < n; i++) ` `  ``{` `    ``int` `p = i + 1;` `    ``int` `q = i + 1;` ` `  `    ``for``(``int` `j = i + 1; j < n; j++) ` `    ``{` `      `  `      ``// Finding the farthest point ` `      ``// p where a^2 + b^2 >= c^2.` `      ``while` `(p < n - 1 && ` `             ``b[i] + b[j] >= b[p + 1])` `        ``p++;` ` `  `      ``q = Math.Max(q, p);` ` `  `      ``// Finding the farthest point ` `      ``// q where a + b > c.` `      ``while` `(q < n - 1 && ` `             ``a[i] + a[j] > a[q + 1])` `        ``q++;` ` `  `      ``// If point p make right triangle.` `      ``if` `(b[i] + b[j] == b[p]) ` `      ``{` `        `  `        ``// All triangle between j ` `        ``// and p are acute triangles. ` `        ``// So add p - j - 1 in x.` `        ``x += Math.Max(p - j - 1, 0);` ` `  `        ``// Increment y by 1.` `        ``y++;` ` `  `        ``// All triangle between q ` `        ``// and p are acute triangles. ` `        ``// So add q - p in z.` `        ``z += q - p;` `      ``}` ` `  `      ``// If no right triangle` `      ``else` `      ``{` `        `  `        ``// All triangle between ` `        ``// j and p are acute triangles. ` `        ``// So add p - j in x.` `        ``x += Math.Max(p - j, 0);` ` `  `        ``// All triangle between q ` `        ``// and p are acute triangles. ` `        ``// So add q - p in z.` `        ``z += q - p;` `      ``}` `    ``}` `  ``}` `  `  `  ``Console.Write(``"Acute Triangle: "` `+ x + ``"\n"``);` `  ``Console.Write(``"Right Triangle: "` `+ y + ``"\n"``);` `  ``Console.Write(``"Obtuse Triangle: "` `+ z + ``"\n"``);` `}` ` `  `// Driver Code` `public` `static` `void` `Main(``string``[] args)` `{` `  ``int` `[]arr = { 2, 3, 9, 10, 12, 15 };` `  ``int` `n = arr.Length;` `  `  `  ``findTriangle(arr, n);` `}` `}`   `// This code is contributed by rutvik_56`

 `= c^2.` `            ``while` `(``\$p` `< ``\$n` `- 1 &&` `                   ``\$b``[``\$i``] + ``\$b``[``\$j``] >= ``\$b``[``\$p` `+ 1])` `                ``\$p``++;`   `            ``\$q` `= max(``\$q``, ``\$p``);`   `            ``// Finding the farthest point q ` `            ``// where a + b > c.` `            ``while` `(``\$q` `< ``\$n` `- 1 && ` `                   ``\$a``[``\$i``] + ``\$a``[``\$j``] > ``\$a``[``\$q` `+ 1])` `                ``\$q``++;`   `            ``// If point p make right triangle.` `            ``if` `(``\$b``[``\$i``] + ``\$b``[``\$j``] == ``\$b``[``\$p``])` `            ``{` `                ``// All triangle between j and p are acute` `                ``// triangles. So add p - j - 1 in x.` `                ``\$x` `+= max(``\$p` `- ``\$j` `- 1, 0);`   `                ``// Increment y by 1.` `                ``\$y``++;`   `                ``// All triangle between q and p are` `                ``// acute triangles. So add q - p in z.` `                ``\$z` `+= ``\$q` `- ``\$p``;` `            ``}`   `            ``// If no right triangle` `            ``else` `            ``{` `                ``// All triangle between j and p are acute` `                ``// triangles. So add p - j in x.` `                ``\$x` `+= max(``\$p` `- ``\$j``, 0);`   `                ``// All triangle between q and p are acute` `                ``// triangles. So add q - p in z.` `                ``\$z` `+= ``\$q` `- ``\$p``;` `            ``}` `        ``}` `    ``}`   `    ``echo` `"Acute Triangle: "``, ``\$x``, ``"\n"``;` `    ``echo` `"Right Triangle: "``, ``\$y``, ``"\n"``;` `    ``echo` `"Obtuse Triangle: "``, ``\$z``, ``"\n"``;` `}`   `// Driver Code` `\$arr` `= ``array``(2, 3, 9, 10, 12, 15);` `\$n` `= sizeof(``\$arr``);` `findTriangle(``\$arr``, ``\$n``);`   `// This code is contributed by akt_mit` `?>`

Output:

```Acute Triangle: 2
Right Triangle: 1
Obtuse Triangle: 4

```

This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.