#[allow(unused_imports)]
use std::io::{BufWriter, stdin, stdout, Write};
#[derive(Default)]
struct Scanner { buf: Vec<String> }
impl Scanner {
fn next<T: std::str::FromStr>(&mut self) -> T {
loop {
if let Some(tok) = self.buf.pop() {
return tok.parse().ok().unwrap();
}
let mut s = String::new();
stdin().read_line(&mut s).unwrap();
self.buf = s.split_whitespace().rev().map(String::from).collect();
}
}
}
macro_rules! io_init {
($scan:ident, $out:ident) => {
let mut $scan = Scanner::default();
let mut $out = BufWriter::new(stdout());
};
}
macro_rules! read {
($scan:ident, $($v:ident=>$t:ty),*) => {
$(let $v = $scan.next::<$t>();)*
};
}
const LOG: usize = 20;
fn slv(scan: &mut Scanner, out: &mut BufWriter<std::io::Stdout>) {
read!(scan, n=>usize);
let mut a = vec![0i64; n+2];
for i in 1..=n {
a[i] = scan.next();
}
let mut lg = vec![0usize; n+2];
for i in 2..=n {
lg[i] = lg[i>>1] + 1;
}
let mut lf = vec![[0usize; LOG]; n+2];
let mut rg = vec![[0usize; LOG]; n+2];
let mut lf1 = vec![[0usize; LOG]; n+2];
let mut rg1 = vec![[0usize; LOG]; n+2];
let mut st = Vec::new();
st.clear();
for i in 1..=n {
while st.last().map_or(false, |&j| a[j] > a[i]) { st.pop(); }
lf[i][0] = *st.last().unwrap_or(&0);
st.push(i);
}
for j in 1..LOG {
for i in 1..=n {
lf[i][j] = lf[ lf[i][j-1] ][j-1];
}
}
st.clear();
for i in 1..=n {
while st.last().map_or(false, |&j| a[j] < a[i]) { st.pop(); }
lf1[i][0] = *st.last().unwrap_or(&0);
st.push(i);
}
for j in 1..LOG {
for i in 1..=n {
lf1[i][j] = lf1[ lf1[i][j-1] ][j-1];
}
}
st.clear();
for i in (1..=n).rev() {
while st.last().map_or(false, |&j| a[j] > a[i]) { st.pop(); }
rg[i][0] = *st.last().unwrap_or(&(n+1));
st.push(i);
}
for j in 1..LOG {
for i in 1..=n {
rg[i][j] = rg[ rg[i][j-1] ][j-1];
}
}
st.clear();
for i in (1..=n).rev() {
while st.last().map_or(false, |&j| a[j] < a[i]) { st.pop(); }
rg1[i][0] = *st.last().unwrap_or(&(n+1));
st.push(i);
}
for j in 1..LOG {
for i in 1..=n {
rg1[i][j] = rg1[ rg1[i][j-1] ][j-1];
}
}
let mut tr = vec![0usize; n+1];
for i in 1..=n {
let mut l = 1;
let mut r = i;
let mut ans = i;
while l <= r {
let mid = (l + r) >> 1;
let d = lg[i-mid];
let mut c = 0;
let mut now = i;
for j in (0..=d).rev() {
let p = lf[now][j];
if p >= mid {
c += 1 << j;
now = p;
}
}
now = i;
for j in (0..=d).rev() {
let p = lf1[now][j];
if p >= mid {
c += 1 << j;
now = p;
}
}
if c == i-mid {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
let mut l = i;
let mut r = n;
let mut ans1 = i;
while l <= r {
let mid = (l + r) >> 1;
let d = lg[mid-i];
let mut c = 0;
let mut now = i;
for j in (0..=d).rev() {
let p = rg[now][j];
if p <= mid {
c += 1 << j;
now = p;
}
}
now = i;
for j in (0..=d).rev() {
let p = rg1[now][j];
if p <= mid {
c += 1 << j;
now = p;
}
}
if c == mid - i {
ans1 = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
tr[ans] = tr[ans].max(ans1);
}
for i in 1..=n {
tr[i] = tr[i].max(tr[i-1]);
}
let mut s = 0u64;
for i in 1..=n {
s += (tr[i] - i + 1) as u64;
}
writeln!(out, "{}", s).unwrap();
}
fn main(){
io_init!(scan,out);
read!(scan, tc=>usize);
for _ in 0..tc {
slv(&mut scan, &mut out);
}
}