#include "towers.h"
#include <bits/stdc++.h>
#include <vector>
using namespace std;
class twodfenwick {
public:
map<pair<int, int>, int> mp;
int n, m;
twodfenwick(int _n, int _m) : n(_n), m(_m) {}
void modify(int x, int y, int d) {
while (x < n) {
int yy = y;
while (y < n) {
mp[make_pair(x, y)] = max(mp[make_pair(x, y)], d);
y |= (y + 1);
}
y = yy;
x |= (x + 1);
}
}
int mx(int x, int y) {
int ans = 0;
while (x >= 0) {
int yy = y;
while (y >= 0) {
ans = max(ans, mp[make_pair(x, y)]);
y = (y & (y + 1)) - 1;
}
y = yy;
x = (x & (x + 1)) - 1;
}
return ans;
}
};
vector<int> hh;
void init(int n, vector<int> h) {
hh = h;
}
int max_towers(int l, int r, int d) {
vector<int> x;
x.push_back(0);
for (int i = l; i <= r; i++) {
x.push_back(hh[i]);
}
int n = r - l + 1;
vector<vector<int>> spt(x.size(), vector<int>(20));
for (int i = 0; i < x.size(); i++) {
spt[i][0] = x[i];
}
for (int j = 1; j < 20; j++) {
for (int i = 0; i < x.size(); i++) {
if (i + (1 << j) - 1 >= x.size()) {
spt[i][j] = -1;
} else {
spt[i][j] = max(spt[i][j - 1], spt[i + (1 << (j - 1))][j - 1]);
}
}
}
auto range = [&](int l, int r) -> int {
int log = __lg(r - l + 1);
return max(spt[l][log], spt[r - (1 << log) + 1][log]);
};
vector<int> nxt(n + 1, n + 1), prv(n + 1, -1);
for (int i = 1; i <= n; i++) {
int low = 1, high = i, idx = -1;
while (low <= high) {
int mid = (low + high) >> 1;
if (range(mid, i) >= x[i] + d) {
idx = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
if (idx != -1) {
prv[i] = idx;
}
}
for (int i = 1; i <= n; i++) {
int low = i, high = n, idx = -1;
while (low <= high) {
int mid = (low + high) >> 1;
if (range(i, mid) >= x[i] + d) {
idx = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
if (idx != -1) {
nxt[i] = idx;
}
}
twodfenwick fenw(n + 1, n + 1);
vector<int> dp(n + 1);
for (int i = 1; i <= n; i++) {
dp[i] = 1;
if (prv[i] != -1) {
dp[i] = max(dp[i], fenw.mx(i, prv[i]) + 1);
}
if (nxt[i] != n + 1) {
fenw.modify(nxt[i], i, dp[i]);
}
}
return *max_element(dp.begin(), dp.end());
}