using
System;
using
System.Collections.Generic;
class
GFG
{
static
int
n = 3;
static
void
findPrefixCount(
int
[,]p_arr,
Boolean [,]set_bit)
{
for
(
int
i = 0; i < n; i++)
{
for
(
int
j = n - 1; j >= 0; j--)
{
if
(set_bit[i, j])
continue
;
if
(j != n - 1)
p_arr[i, j] += p_arr[i, j + 1];
p_arr[i, j] += (!set_bit[i, j]) ? 1 : 0;
}
}
}
public
class
pair
{
public
int
first,second;
public
pair(){}
public
pair(
int
a,
int
b)
{
first = a;
second = b;
}
}
static
int
matrixOrValueOne(Boolean [,]set_bit)
{
int
[,]p_arr =
new
int
[n, n];
for
(
int
i = 0; i < n; i++)
for
(
int
j = 0; j < n; j++)
p_arr[i, j] = 0;
findPrefixCount(p_arr, set_bit);
int
count_zero_submatrices = 0;
for
(
int
j = 0; j < n; j++)
{
int
i = n - 1;
Stack<pair > q =
new
Stack<pair >();
int
to_sum = 0;
while
(i >= 0)
{
int
c = 0;
while
(q.Count != 0 &&
q.Peek().first > p_arr[i, j])
{
to_sum -= (q.Peek().second + 1) *
(q.Peek().first - p_arr[i, j]);
c += q.Peek().second + 1;
q.Pop();
}
to_sum += p_arr[i, j];
count_zero_submatrices += to_sum;
q.Push(
new
pair(p_arr[i, j], c));
i--;
}
}
return
(n * (n + 1) * n * (n + 1)) /
4 - count_zero_submatrices;
}
static
int
sumOrMatrix(
int
[,]arr)
{
int
sum = 0;
int
mul = 1;
for
(
int
i = 0; i < 30; i++)
{
Boolean [,]set_bit =
new
Boolean[n, n];
for
(
int
R = 0; R < n; R++)
for
(
int
C = 0; C < n; C++)
set_bit[R, C] = ((arr[R, C] &
(1 << i)) != 0);
sum += (mul * matrixOrValueOne(set_bit));
mul *= 2;
}
return
sum;
}
public
static
void
Main(String []args)
{
int
[,]arr = {{ 9, 7, 4 },
{ 8, 9, 2 },
{ 11, 11, 5 }};
Console.WriteLine( sumOrMatrix(arr));
}
}