Submission #483355

#TimeUsernameProblemLanguageResultExecution timeMemory
483355BERNARB01Global Warming (CEOI18_glo)C++17
62 / 100
494 ms38592 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename T = int>
struct Max {
  T val;
  const T nut = 0;
  Max() {
    val = nut;
  }
  Max(const T& _val) {
    val = _val;
  }
  void operator =(const Max& o) {
    val = o.val;
  }
  Max operator +(const Max& o) const {
    return val > o.val ? *this : o;
  }
};

template<typename T, typename T2 = int>
struct segtree {
  int b;
  vector<T> tr;
  segtree() {}
  segtree(int n) {
    b = 1;
    while (b < n) {
      b <<= 1;
    }
    tr.assign(b << 1, T());
  }
  segtree(const vector<T2>& arr) {
    b = 1;
    while (b < (int) arr.size()) {
      b <<= 1;
    }
    tr.assign(b << 1, T());
    for (int i = 0; i < (int) arr.size(); i++) {
      tr[i + b] = T(arr[i]);
    }
    bld();
  }
  void bld() {
    for (int i = b - 1; i > 0; i--) {
      tr[i] = tr[i << 1] + tr[i << 1 | 1];
    }
  }
  void upd(int i, const T2& val, bool add = false) {
    i += b;
    tr[i] = (add ? tr[i] + T(val) : T(val));
    for (i >>= 1; i > 0; i >>= 1) {
      tr[i] = tr[i << 1] + tr[i << 1 | 1];
    }
  }
  T qry(int l, int r) {
    T ansl = T(), ansr = T();
    for (l += b, r += b; l <= r; l >>= 1, r >>= 1) {
      if (l & 1) ansl = ansl + tr[l++];
      if (!(r & 1)) ansr = tr[r--] + ansr;
    }
    return ansl + ansr;
  }
  int idx_of_last_max() {
    int ret = 0;
    for (int i = 2; i < 2 * b; i <<= 1) {
      i += (tr[i + 1].val == tr[1].val);
      ret = i - b;
    }
    return ret;
  }
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, x;
  cin >> n >> x;
  vector<int> a(n);
  map<int, int> mp;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    mp[a[i]] = 0;
    mp[a[i] - x] = 0;
  }
  int id = 0;
  for (auto& [f, s] : mp) {
    s = id++;
  }
  vector<int> b(n);
  for (int i = 0; i < n; i++) {
    b[i] = mp[a[i]];
  }
  segtree<Max<>> st(id);
  int lds_len = 1;
  vector<pair<int, int>> suf(n);
  for (int i = n - 1; i >= 0; i--) {
    int j = st.qry(b[i] + 1, id).val;
    st.upd(b[i], j + 1);
    lds_len = max(lds_len, j + 1);
    suf[i] = {lds_len, st.idx_of_last_max()};
  }
  for (int i = 0; i < n; i++) {
    b[i] = mp[a[i] - x];
  }
  segtree<Max<>> stt(id);
  int ans = lds_len;
  for (int i = 0; i < n - 1; i++) {
    stt.upd(b[i], 1 + stt.qry(0, b[i] - 1).val);
    auto [sl, ns] = suf[i + 1];
    ans = max(ans, stt.qry(0, ns - 1).val + sl);
  }
  cout << ans << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...