#include "triples.h"
#include <bits/stdc++.h>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
using namespace std;
using ll = long long;
long long count_triples(std::vector<int> H) {
int n = sz(H);
ll ret = 0;
set<vector<int>> st;
auto check = [&](int i, int j, int k) -> void {
if (!(0 <= i && i < j && j < k && k < n)) return;
vector<int> a = {k - i, k - j, j - i};
vector<int> b = {H[i], H[j], H[k]};
sort(all(a));
sort(all(b));
if (a == b) {
st.insert({i, j, k});
}
};
// k = hi + i
for (int i = 0; i < n; ++i) {
int k = H[i] + i;
check(i, i + H[k], k);
check(i, k - H[k], k);
}
// i = k - hk
for (int k = 0; k < n; ++k) {
int i = k - H[k];
check(i, H[i] + i, k);
check(i, k - H[i], k);
}
// j = hi + i
for (int i = 0; i < n; ++i) {
int j = H[i] + i;
if (j < n) {
check(i, j, i + H[j]);
}
}
ret = sz(st);
int C = sqrt(n);
vector<vector<int>> d(2 * n);
for (int i = 0; i < n; ++i) {
d[n + i - H[i]].push_back(i);
}
// for (auto& v : st) {
// for (int j : v) {
// cerr << j + 1 << " ";
// }
// cerr << endl;
// }
// for (int i = 0; i < 2 * n; ++i) {
// cerr << i << "=";
// for (int j : d[i]) {
// cerr << j << " ";
// }
// cerr << endl;
// }
for (int _ = 0; _ < 2 * n; ++_) {
auto& v = d[_];
if (sz(v) < C) {
for (int it = 0; it < sz(v); ++it) {
for (int it1 = it + 1; it1 < sz(v); ++it1) {
int i = v[it];
int j = v[it1];
if (i > j) swap(i, j);
int k = (i + j + H[i] + H[j]);
assert(k % 2 == 0);
k /= 2;
if (k < n && k > j && k - i == H[j]) {
if (j - i == H[k] && k - j == H[i]) {
ret += !st.count({i, j, k});
}
}
}
}
} else {
for (int k = 0; k < n; ++k) {
int i = (_ + k - H[k] - n);
if (i < 0 || (i % 2 != 0)) continue;
// cerr << _ << " " << k << " " << H[k] << endl;
assert(i % 2 == 0);
i /= 2;
int j = _ + k - i - n;
if (0 <= i && i < j && j < k && k - i == H[j] && j - i == H[k] && k - j == H[i]) {
// cerr << i+1 << " " << j+1 << " " << k+1 << endl;
ret += !st.count({i, j, k});
}
}
}
}
return ret;
}
std::vector<int> construct_range(int M, int K) {
return {};
}