#include <bits/stdc++.h>
using namespace std;
void Solve1 ()
{
int cantitate , limita , lungime;
cin >> cantitate >> limita >> lungime;
vector <int> sir(cantitate);
for (auto& locatie : sir)
{ cin >> locatie; }
sort(sir.begin() , sir.end());
int64_t modalitati = 0;
for (int stanga = 0 , dreapta = 0 ; dreapta < cantitate ; dreapta++)
{
while (sir[dreapta] - sir[stanga] > limita)
{ stanga++; }
modalitati += dreapta - stanga;
}
cout << modalitati;
}
int arbore[150000];
void Update (int indice , const int termen , const int lungime)
{
for ( ; indice <= lungime ; indice += (indice & -indice))
{ arbore[indice] += termen; }
}
int Query (int stanga , int dreapta)
{
stanga--;
int rezultat = 0;
while (stanga != dreapta) {
if (stanga < dreapta) { rezultat += arbore[dreapta]; dreapta ^= (dreapta & -dreapta); }
else { rezultat -= arbore[stanga]; stanga ^= (stanga & -stanga); }
}
return rezultat;
}
void Solve2 ()
{
int cantitate , limita , lungime;
cin >> cantitate >> limita >> lungime;
vector < pair <int , int> > sir(cantitate);
for (auto& locatie : sir)
{
cin >> locatie.first >> locatie.second;
locatie = {locatie.first + locatie.second - 1 , locatie.first - locatie.second + lungime};
}
sort(sir.begin() , sir.end());
(lungime <<= 1)--;
int64_t modalitati = 0;
for (int stanga = 0 , dreapta = 0 ; dreapta < cantitate ; dreapta++)
{
while (sir[dreapta].first - sir[stanga].first > limita)
{ Update(sir[stanga].second , -1 , lungime); stanga++; }
modalitati += Query(max(1 , sir[dreapta].second - limita) , min(lungime , sir[dreapta].second + limita));
Update(sir[dreapta].second , 1 , lungime);
}
cout << modalitati;
}
void Solve3 ()
{
cout << '1';
}
int main ()
{
ios :: sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int cerinta;
cin >> cerinta;
if (cerinta == 1) { Solve1(); }
else if (cerinta == 2) { Solve2(); }
else { Solve3(); }
return 0;
}