#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Subtask1
{
void solve()
{
int n, d, m; cin>>n>>d>>m;
vector<int> a(n);
for(int i = 0; i < n; i++) cin>>a[i];
sort(a.begin(), a.end());
int ans = 0, j = 0;
for(int i = 0; i < n; i++){
while(a[i] - a[j] > d) j++;
ans += i-j;
}
cout<<ans;
}
}
namespace Subtask2
{
int bit[300005], m, ans = 0;
vector<int> request[300005], add[300005];
void update(int p, int v)
{
for(int i = p; i <= m; i += i & (-i)) bit[i] += v;
}
int query(int p)
{
int ans = 0;
for(int i = p; i > 0; i -= i & (-i)) ans += bit[i];
return ans;
}
void solve()
{
int n, d; cin>>n>>d>>m;
vector<pair<int, int>> a;
for(int i = 1; i <= n; i++){
int x, y; cin>>x>>y;
int nx = x+y, ny = x-y+m;
x = nx; y = ny;
a.push_back({x, y});
add[x].push_back(y);
request[min(x+d, 2*m)].push_back(min(y+d, 2*m));
if(x-d-1 > 0) request[x-d-1].push_back(-min(y+d, 2*m));
if(y-d-1 > 0) request[min(x+d, 2*m)].push_back(-(y-d-1));
if(x-d-1 > 0 && y-d-1 > 0) request[x-d-1].push_back(y-d-1);
}
m <<= 1;
for(int i = 1; i <= m; i++){
for(int j : add[i]) update(j, 1);
for(int j : request[i]){
if(j > 0) ans += query(j);
else ans -= query(-j);
}
}
cout<<(ans - n) / 2;
}
}
namespace Subtask3
{
const int sd = 80;
int32_t a[80][80][80], dis[80][80][80][155], cd[80][80][155];
void preprocess(int m)
{
for(int i = 1; i <= m; i++){
//Preprocess for board i
for(int j = 1; j <= m; j++){
for(int k = 1; k <= m; k++) dis[i][j][k][0] = cd[j][k][0] = a[i][j][k];
}
/*Up - left*/
for(int j = 1; j <= m; j++){
for(int k = 1; k <= m; k++){
for(int l = 1; l <= 2*m; l++){
cd[j][k][l] = cd[j][k][0] + cd[j-1][k][l-1] + cd[j][k-1][l-1];
if(l > 1) cd[j][k][l] -= cd[j-1][k-1][l-2];
dis[i][j][k][l] += cd[j][k][l];
}
}
}
/*Up - right*/
for(int j = 1; j <= m; j++){
for(int k = m; k >= 1; k--){
for(int l = 1; l <= 2*m; l++){
cd[j][k][l] = cd[j][k][0] + cd[j-1][k][l-1] + cd[j][k+1][l-1];
if(l > 1) cd[j][k][l] -= cd[j-1][k+1][l-2];
dis[i][j][k-1][l+1] += cd[j][k][l];
}
}
}
/*Down - left*/
for(int j = m; j >= 1; j--){
for(int k = 1; k <= m; k++){
for(int l = 1; l <= 2*m; l++){
cd[j][k][l] = cd[j][k][0] + cd[j+1][k][l-1] + cd[j][k-1][l-1];
if(l > 1) cd[j][k][l] -= cd[j+1][k-1][l-2];
dis[i][j-1][k][l+1] += cd[j][k][l];
}
}
}
/*Down - right*/
for(int j = m; j >= 1; j--){
for(int k = m; k >= 1; k--){
for(int l = 1; l <= 2*m; l++){
cd[j][k][l] = cd[j][k][0] + cd[j+1][k][l-1] + cd[j][k+1][l-1];
if(l > 1) cd[j][k][l] -= cd[j+1][k+1][l-2];
dis[i][j-1][k-1][l+2] += cd[j][k][l];
}
}
}
}
}
void solve()
{
int n, d, m; cin>>n>>d>>m;
vector<vector<int>> p;
for(int i = 1; i <= n; i++){
int x, y, z; cin>>x>>y>>z;
p.push_back({x, y, z});
a[x][y][z] = 1;
}
preprocess(m);
int ans = 0;
for(int i = 0; i < n; i++){
int x = p[i][0], y = p[i][1], z = p[i][2];
for(int j = 1; j <= m; j++) if(abs(x-j) <= d){
int re = d - abs(x-j);
ans += dis[j][y][z][re];
}
}
cout<<(ans-n)/2;
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int b; cin>>b;
if(b == 1) Subtask1::solve();
else if(b == 2) Subtask2::solve();
else Subtask3::solve();
}