/// - Art -
#include <bits/stdc++.h>
#define el cout << '\n'
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define REV(i, b, a) for (int i = (b), _a = (a); i >= _a; --i)
#define REP(i, c) for (int i = 0, _c = (c); i < _c; ++i)
const int N = 1e5 + 7;
using namespace std;
int B, n, D, M;
namespace B_1 {
bool checkSubtask() {
return B == 1;
}
int point[N];
void solve() {
FOR (i, 1, n) {
cin >> point[i];
}
sort(point + 1, point + n + 1);
int it = 1;
long long res = 0;
FOR (i, 1, n) {
while (it <= n && point[it] - point[i] <= D) {
++it;
}
res += it - i - 1;
}
cout << res, el;
}
}
struct FenwickTree {
int n;
vector<int> bit;
FenwickTree(int _n = 0) {
n = _n;
bit.assign(_n + 7, 0);
}
void update(int u, int add) {
for (; u <= n; u += u & -u) {
bit[u] += add;
}
}
int get(int u) {
int res = 0;
for (; u > 0; u -= u & -u) {
res += bit[u];
}
return res;
}
int get(int l, int r) {
return get(r) - get(l - 1);
}
};
namespace B_2 {
bool checkSubtask() {
return B == 2;
}
pair<int, int> point[N];
void solve() {
FOR (i, 1, n) {
int x, y;
cin >> x >> y;
point[i] = {x + y + M, x - y + M};
}
sort(point + 1, point + n + 1);
FenwickTree fen(2 * M);
int it = 1;
long long res = 0;
FOR (i, 1, n) {
while (it <= n && point[it].first - point[i].first <= D) {
fen.update(point[it].second, +1);
++it;
}
fen.update(point[i].second, -1);
res += fen.get(point[i].second - D, min(point[i].second + D, 2 * M));
}
cout << res, el;
}
}
namespace B_3 {
bool checkSubtask() {
return B == 3;
}
vector<pair<int, int>> point[77];
long long countSingle(int idx) {
FenwickTree fen(2 * M);
int it = 0;
long long res = 0;
REP (i, point[idx].size()) {
while (it < point[idx].size() &&
point[idx][it].first - point[idx][i].first <= D) {
fen.update(point[idx][it].second, +1);
++it;
}
fen.update(point[idx][i].second, -1);
res += fen.get(point[idx][i].second - D, min(point[idx][i].second + D, 2 * M));
}
return res;
}
long long countDouble(int idx_i, int idx_j) {
FenwickTree fen(2 * M);
int nD = D - abs(idx_j - idx_i);
if (nD < 0) {
return 0;
}
int sta = 0, fin = 0;
long long res = 0;
REP (i, point[idx_i].size()) {
while (fin < point[idx_j].size() &&
abs(point[idx_j][fin].first - point[idx_i][i].first) <= nD) {
fen.update(point[idx_j][fin].second, +1);
++fin;
}
while (sta <= fin &&
abs(point[idx_j][sta].first - point[idx_i][i].first) > nD) {
fen.update(point[idx_j][sta].second, -1);
++sta;
}
res += fen.get(point[idx_i][i].second - nD, min(point[idx_i][i].second + nD, 2 * M));
}
return res;
}
void solve() {
FOR (i, 1, n) {
int x, y, z;
cin >> x >> y >> z;
point[x].emplace_back(y + z + M, y - z + M);
}
long long res = 0;
FOR (i, 1, M) if (!point[i].empty()) {
sort(point[i].begin(), point[i].end());
res += countSingle(i);
FOR (j, 1, i - 1) if (!point[j].empty()) {
res += countDouble(j, i);
}
}
cout << res, el;
}
}
int main() {
#define name "art"
if (fopen(name".inp", "r")) {
freopen(name".inp", "r", stdin);
freopen(name".out", "w", stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> B >> n >> D >> M;
if (B_1::checkSubtask()) return B_1::solve(), 0;
if (B_2::checkSubtask()) return B_2::solve(), 0;
if (B_3::checkSubtask()) return B_3::solve(), 0;
return 0;
}
Compilation message (stderr)
pairs.cpp: In function 'int main()':
pairs.cpp:168:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
168 | freopen(name".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp:169:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
169 | freopen(name".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |