#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = a; i <= b; i++)
#define FOD(i, a, b) for(int i = a; i >= b; i--)
#define fi first
#define se second
#define ll long long
#define db double
#define ii pair<int,int>
#define pb push_back
#define MASK(i) (1LL << i)
#define sq(i) (1LL * (i) * (i))
#define task "task"
const ll INF = 1e18;
const int inf = 1e9;
const int N = 3e5 + 4;
int n, d;
int a[N];
set<int> cur;
struct Smt {
int mx[4 * N];
void upd(int id, int l, int r, int pos, int d) {
if(pos < l || pos > r) return;
if(l == r) {
mx[id] = d;
return;
}
int mid = l + r >> 1;
upd(id << 1, l, mid, pos, d);
upd(id << 1 | 1, mid + 1, r, pos, d);
mx[id] = max(mx[id << 1], mx[id << 1 | 1]);
}
int get(int id, int l, int r, int u, int v) {
if(l > v || r < u) return -1;
if(l >= u && r <= v) return mx[id];
int mid = l + r >> 1;
return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v));
}
} smt;
struct Dsu {
int root[N], sze[N], mn[N];
void init() {
FOR(i, 1, n) {
root[i] = i;
sze[i] = 1;
mn[i] = i;
}
}
int anc(int u) {
return root[u] == u ? u : root[u] = anc(root[u]);
}
bool join(int u, int v) {
u = anc(u);
v = anc(v);
if(u == v) return false;
if(sze[u] < sze[v]) swap(u, v);
root[v] = u;
sze[u] += sze[v];
mn[u] = min(mn[u], mn[v]);
return true;
}
} dsu;
signed main() {
if(fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> d;
FOR(i, 1, n) cin >> a[i];
vector<int> idx;
FOR(i, 1, n) idx.pb(i);
sort(idx.begin(), idx.end(), [&](int u, int v) {
if(a[u] == a[v]) return u > v;
return a[u] < a[v];
});
dsu.init();
for(int i : idx) {
set<int>::iterator it = cur.lower_bound(i);
if(it != cur.end() && abs(*it - i) <= d) dsu.join(i, *it);
if(it != cur.begin()) {
it--;
if(abs(*it - i) <= d) dsu.join(i, *it);
}
int best = 1;
int mn = dsu.mn[dsu.anc(i)];
if(mn < i) best = max(best, smt.get(1, 1, n, mn, i - 1) + 1);
smt.upd(1, 1, n, i, best);
cur.insert(i);
}
cout << smt.mx[1] << '\n';
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:76:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
76 | freopen(task".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:77:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
77 | freopen(task".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... |