using
System;
using
System.Collections.Generic;
using
System.Linq;
class
MainClass {
public
static
void
countSubarrays(
int
[] arr,
int
N,
int
X,
int
Y,
int
Z)
{
var
m =
new
Dictionary<Tuple<Tuple<
int
,
int
>,
int
>,
int
>();
m.Add(
new
Tuple<Tuple<
int
,
int
>,
int
>(
new
Tuple<
int
,
int
>(0, 0), 0),
1);
int
fNum_count = 0, sNum_count = 0, tNum_count = 0;
int
mini;
for
(
int
i = 0; i < N; i++) {
if
(arr[i] == X) {
fNum_count++;
mini = Math.Min(
Math.Min(fNum_count, sNum_count),
tNum_count);
fNum_count -= mini;
sNum_count -= mini;
tNum_count -= mini;
}
else
if
(arr[i] == Y) {
sNum_count++;
mini = Math.Min(
Math.Min(fNum_count, sNum_count),
tNum_count);
fNum_count -= mini;
sNum_count -= mini;
tNum_count -= mini;
}
else
if
(arr[i] == Z) {
tNum_count++;
mini = Math.Min(
Math.Min(fNum_count, sNum_count),
tNum_count);
fNum_count -= mini;
sNum_count -= mini;
tNum_count -= mini;
}
if
(m.ContainsKey(
new
Tuple<Tuple<
int
,
int
>,
int
>(
new
Tuple<
int
,
int
>(fNum_count,
sNum_count),
tNum_count))) {
m[
new
Tuple<Tuple<
int
,
int
>,
int
>(
new
Tuple<
int
,
int
>(fNum_count,
sNum_count),
tNum_count)]++;
}
else
{
m.Add(
new
Tuple<Tuple<
int
,
int
>,
int
>(
new
Tuple<
int
,
int
>(fNum_count,
sNum_count),
tNum_count),
1);
}
}
long
final_ans = 0;
foreach
(
var
item
in
m)
{
long
val = item.Value;
final_ans += (val * (val - 1)) / 2;
}
Console.WriteLine(final_ans);
}
public
static
void
Main(
string
[] args)
{
int
[] arr = { 3, 6, 7, 8, 3, 6, 7 };
int
N = arr.Length;
int
X = 3, Y = 6, Z = 7;
countSubarrays(arr, N, X, Y, Z);
}
}